summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj5
-rw-r--r--include/SDL_video.h4
-rw-r--r--src/video/SDL_sysvideo.h3
-rw-r--r--src/video/SDL_video.c23
-rw-r--r--src/video/cocoa/SDL_cocoamodes.m2
-rw-r--r--src/video/directfb/SDL_DirectFB_modes.c2
-rw-r--r--src/video/haiku/SDL_bmodes.cc2
-rw-r--r--src/video/kmsdrm/SDL_kmsdrmvideo.c2
-rw-r--r--src/video/pandora/SDL_pandora.c2
-rw-r--r--src/video/psp/SDL_pspvideo.c2
-rw-r--r--src/video/qnx/video.c2
-rw-r--r--src/video/raspberry/SDL_rpivideo.c2
-rw-r--r--src/video/uikit/SDL_uikitappdelegate.m24
-rw-r--r--src/video/uikit/SDL_uikitmodes.h2
-rw-r--r--src/video/uikit/SDL_uikitmodes.m25
-rw-r--r--src/video/vivante/SDL_vivantevideo.c2
-rw-r--r--src/video/wayland/SDL_waylandvideo.c2
-rw-r--r--src/video/windows/SDL_windowsmodes.c2
-rw-r--r--src/video/winrt/SDL_winrtvideo.cpp4
-rw-r--r--src/video/x11/SDL_x11modes.c4
20 files changed, 91 insertions, 25 deletions
diff --git a/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj b/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj
index 7767c0625..191864d98 100644
--- a/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj
+++ b/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj
@@ -1795,6 +1795,9 @@
FABA34961D8B582100915323 = {
ProvisioningStyle = Automatic;
};
+ FDD2C53D0E2E80E400B7A85F = {
+ DevelopmentTeam = MXGJJ98X76;
+ };
};
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "TestiPhoneOS" */;
@@ -2865,6 +2868,7 @@
FDD2C54C0E2E80E400B7A85F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ DEVELOPMENT_TEAM = MXGJJ98X76;
INFOPLIST_FILE = Info.plist;
PRODUCT_NAME = testsprite2;
};
@@ -2873,6 +2877,7 @@
FDD2C54D0E2E80E400B7A85F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ DEVELOPMENT_TEAM = MXGJJ98X76;
INFOPLIST_FILE = Info.plist;
PRODUCT_NAME = testsprite2;
};
diff --git a/include/SDL_video.h b/include/SDL_video.h
index c7411ca49..9f6f179aa 100644
--- a/include/SDL_video.h
+++ b/include/SDL_video.h
@@ -175,7 +175,9 @@ typedef enum
typedef enum
{
SDL_DISPLAYEVENT_NONE, /**< Never used */
- SDL_DISPLAYEVENT_ORIENTATION /**< Display orientation has changed to data1 */
+ SDL_DISPLAYEVENT_ORIENTATION, /**< Display orientation has changed to data1 */
+ SDL_DISPLAYEVENT_CONNECTED, /**< Display has been added to the system */
+ SDL_DISPLAYEVENT_DISCONNECTED, /**< Display has been removed from the system */
} SDL_DisplayEventID;
typedef enum
diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h
index 8690c3471..81322b3c4 100644
--- a/src/video/SDL_sysvideo.h
+++ b/src/video/SDL_sysvideo.h
@@ -439,7 +439,8 @@ extern VideoBootStrap OFFSCREEN_bootstrap;
extern SDL_VideoDevice *SDL_GetVideoDevice(void);
extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
-extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
+extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display, SDL_bool send_event);
+extern void SDL_DelVideoDisplay(int index);
extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
extern int SDL_GetIndexOfDisplay(SDL_VideoDisplay *display);
extern SDL_VideoDisplay *SDL_GetDisplay(int displayIndex);
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
index 6696e6c1f..28001512e 100644
--- a/src/video/SDL_video.c
+++ b/src/video/SDL_video.c
@@ -595,11 +595,11 @@ SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode)
}
display.current_mode = display.desktop_mode;
- return SDL_AddVideoDisplay(&display);
+ return SDL_AddVideoDisplay(&display, SDL_FALSE);
}
int
-SDL_AddVideoDisplay(const SDL_VideoDisplay * display)
+SDL_AddVideoDisplay(const SDL_VideoDisplay * display, SDL_bool send_event)
{
SDL_VideoDisplay *displays;
int index = -1;
@@ -621,12 +621,31 @@ SDL_AddVideoDisplay(const SDL_VideoDisplay * display)
SDL_itoa(index, name, 10);
displays[index].name = SDL_strdup(name);
}
+
+ if (send_event) {
+ SDL_SendDisplayEvent(&_this->displays[index], SDL_DISPLAYEVENT_CONNECTED, 0);
+ }
} else {
SDL_OutOfMemory();
}
return index;
}
+void
+SDL_DelVideoDisplay(int index)
+{
+ if (index < 0 || index >= _this->num_displays) {
+ return;
+ }
+
+ SDL_SendDisplayEvent(&_this->displays[index], SDL_DISPLAYEVENT_DISCONNECTED, 0);
+
+ if (index < (_this->num_displays - 1)) {
+ SDL_memmove(&_this->displays[index], &_this->displays[index+1], (_this->num_displays - index - 1)*sizeof(_this->displays[index]));
+ }
+ --_this->num_displays;
+}
+
int
SDL_GetNumVideoDisplays(void)
{
diff --git a/src/video/cocoa/SDL_cocoamodes.m b/src/video/cocoa/SDL_cocoamodes.m
index c40e41838..79210ffc0 100644
--- a/src/video/cocoa/SDL_cocoamodes.m
+++ b/src/video/cocoa/SDL_cocoamodes.m
@@ -389,7 +389,7 @@ Cocoa_InitModes(_THIS)
display.desktop_mode = mode;
display.current_mode = mode;
display.driverdata = displaydata;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
SDL_free(display.name);
}
}
diff --git a/src/video/directfb/SDL_DirectFB_modes.c b/src/video/directfb/SDL_DirectFB_modes.c
index 5b3e534d8..114d95c5f 100644
--- a/src/video/directfb/SDL_DirectFB_modes.c
+++ b/src/video/directfb/SDL_DirectFB_modes.c
@@ -258,7 +258,7 @@ DirectFB_InitModes(_THIS)
SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer, DLSCL_SHARED));
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
}
SDL_DFB_FREE(screencbdata);
return;
diff --git a/src/video/haiku/SDL_bmodes.cc b/src/video/haiku/SDL_bmodes.cc
index 5fa147f9e..bf41b1b50 100644
--- a/src/video/haiku/SDL_bmodes.cc
+++ b/src/video/haiku/SDL_bmodes.cc
@@ -228,7 +228,7 @@ static void _AddDisplay(BScreen *screen) {
display.desktop_mode = *mode;
display.current_mode = *mode;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
}
/*
diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c
index ef25895bd..a125365ec 100644
--- a/src/video/kmsdrm/SDL_kmsdrmvideo.c
+++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c
@@ -1262,7 +1262,7 @@ KMSDRM_VideoInit(_THIS)
display.current_mode = display.desktop_mode;
display.driverdata = dispdata;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
/****************/
/* Atomic block */
diff --git a/src/video/pandora/SDL_pandora.c b/src/video/pandora/SDL_pandora.c
index 8817e0611..e78c0f2e5 100644
--- a/src/video/pandora/SDL_pandora.c
+++ b/src/video/pandora/SDL_pandora.c
@@ -173,7 +173,7 @@ PND_videoinit(_THIS)
display.current_mode = current_mode;
display.driverdata = NULL;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
return 1;
}
diff --git a/src/video/psp/SDL_pspvideo.c b/src/video/psp/SDL_pspvideo.c
index 20ac66538..fa1139ecd 100644
--- a/src/video/psp/SDL_pspvideo.c
+++ b/src/video/psp/SDL_pspvideo.c
@@ -167,7 +167,7 @@ PSP_VideoInit(_THIS)
display.current_mode = current_mode;
display.driverdata = NULL;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
return 1;
}
diff --git a/src/video/qnx/video.c b/src/video/qnx/video.c
index 3457ca0fb..049d81404 100644
--- a/src/video/qnx/video.c
+++ b/src/video/qnx/video.c
@@ -47,7 +47,7 @@ videoInit(_THIS)
SDL_zero(display);
- if (SDL_AddVideoDisplay(&display) < 0) {
+ if (SDL_AddVideoDisplay(&display, SDL_FALSE) < 0) {
return -1;
}
diff --git a/src/video/raspberry/SDL_rpivideo.c b/src/video/raspberry/SDL_rpivideo.c
index bed3b4976..d077ecda3 100644
--- a/src/video/raspberry/SDL_rpivideo.c
+++ b/src/video/raspberry/SDL_rpivideo.c
@@ -196,7 +196,7 @@ AddDispManXDisplay(const int display_id)
display.driverdata = data;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
}
int
diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m
index ac37ebd7c..a38f00b2a 100644
--- a/src/video/uikit/SDL_uikitappdelegate.m
+++ b/src/video/uikit/SDL_uikitappdelegate.m
@@ -47,7 +47,7 @@ static int exit_status;
/* SDL is being built as a static library, include main() */
int main(int argc, char *argv[])
{
- return SDL_UIKitRunApp(argc, argv, SDL_main);
+ return SDL_UIKitRunApp(argc, argv, SDL_main);
}
#endif /* SDL_MAIN_NEEDED && !IOS_DYLIB */
@@ -56,7 +56,7 @@ int SDL_UIKitRunApp(int argc, char *argv[], SDL_main_func mainFunction)
int i;
/* store arguments */
- forward_main = mainFunction;
+ forward_main = mainFunction;
forward_argc = argc;
forward_argv = (char **)malloc((argc+1) * sizeof(char *));
for (i = 0; i < argc; i++) {
@@ -349,6 +349,14 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh)
- (void)postFinishLaunch
{
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+
+ [center addObserver:self selector:@selector(handleScreenDidConnectNotification:)
+ name:UIScreenDidConnectNotification object:nil];
+ [center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:)
+ name:UIScreenDidDisconnectNotification object:nil];
+
+
/* Hide the launch screen the next time the run loop is run. SDL apps will
* have a chance to load resources while the launch screen is still up. */
[self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0];
@@ -520,6 +528,18 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh)
#endif
+- (void)handleScreenDidConnectNotification:(NSNotification*)aNotification
+{
+ UIScreen *uiscreen = [aNotification object];
+ UIKit_AddDisplay(uiscreen, SDL_TRUE);
+}
+
+- (void)handleScreenDidDisconnectNotification:(NSNotification*)aNotification
+{
+ UIScreen *uiscreen = [aNotification object];
+ UIKit_DelDisplay(uiscreen);
+}
+
@end
#endif /* SDL_VIDEO_DRIVER_UIKIT */
diff --git a/src/video/uikit/SDL_uikitmodes.h b/src/video/uikit/SDL_uikitmodes.h
index e895ce4ae..25b9eca6a 100644
--- a/src/video/uikit/SDL_uikitmodes.h
+++ b/src/video/uikit/SDL_uikitmodes.h
@@ -43,6 +43,8 @@
extern SDL_bool UIKit_IsDisplayLandscape(UIScreen *uiscreen);
extern int UIKit_InitModes(_THIS);
+extern int UIKit_AddDisplay(UIScreen *uiscreen, SDL_bool send_event);
+extern void UIKit_DelDisplay(UIScreen *uiscreen);
extern void UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay * display);
extern int UIKit_GetDisplayDPI(_THIS, SDL_VideoDisplay * display, float * ddpi, float * hdpi, float * vdpi);
extern int UIKit_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
diff --git a/src/video/uikit/SDL_uikitmodes.m b/src/video/uikit/SDL_uikitmodes.m
index 4c1c09a5f..8db5fbeb0 100644
--- a/src/video/uikit/SDL_uikitmodes.m
+++ b/src/video/uikit/SDL_uikitmodes.m
@@ -265,10 +265,11 @@ UIKit_AddDisplayMode(SDL_VideoDisplay * display, int w, int h, UIScreen * uiscre
return 0;
}
-static int
-UIKit_AddDisplay(UIScreen *uiscreen)
+int
+UIKit_AddDisplay(UIScreen *uiscreen, SDL_bool send_event)
{
UIScreenMode *uiscreenmode = uiscreen.currentMode;
+ CGPoint origin = uiscreen.bounds.origin;
CGSize size = uiscreen.bounds.size;
SDL_VideoDisplay display;
SDL_DisplayMode mode;
@@ -302,11 +303,27 @@ UIKit_AddDisplay(UIScreen *uiscreen)
}
display.driverdata = (void *) CFBridgingRetain(data);
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, send_event);
return 0;
}
+void
+UIKit_DelDisplay(UIScreen *uiscreen)
+{
+ int i;
+
+ for (i = 0; i < SDL_GetNumVideoDisplays(); ++i) {
+ SDL_DisplayData *data = (__bridge SDL_DisplayData *)SDL_GetDisplayDriverData(i);
+
+ if (data && data.uiscreen == uiscreen) {
+ CFRelease(SDL_GetDisplayDriverData(i));
+ SDL_DelVideoDisplay(i);
+ return;
+ }
+ }
+}
+
SDL_bool
UIKit_IsDisplayLandscape(UIScreen *uiscreen)
{
@@ -326,7 +343,7 @@ UIKit_InitModes(_THIS)
{
@autoreleasepool {
for (UIScreen *uiscreen in [UIScreen screens]) {
- if (UIKit_AddDisplay(uiscreen) < 0) {
+ if (UIKit_AddDisplay(uiscreen, SDL_FALSE) < 0) {
return -1;
}
}
diff --git a/src/video/vivante/SDL_vivantevideo.c b/src/video/vivante/SDL_vivantevideo.c
index ddae15371..bc6bb62c5 100644
--- a/src/video/vivante/SDL_vivantevideo.c
+++ b/src/video/vivante/SDL_vivantevideo.c
@@ -170,7 +170,7 @@ VIVANTE_AddVideoDisplays(_THIS)
display.desktop_mode = current_mode;
display.current_mode = current_mode;
display.driverdata = data;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
return 0;
}
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index 251311d20..469bb7364 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -274,7 +274,7 @@ display_handle_done(void *data,
{
/* !!! FIXME: this will fail on any further property changes! */
SDL_VideoDisplay *display = data;
- SDL_AddVideoDisplay(display);
+ SDL_AddVideoDisplay(display, SDL_FALSE);
wl_output_set_user_data(output, display->driverdata);
SDL_free(display->name);
SDL_free(display);
diff --git a/src/video/windows/SDL_windowsmodes.c b/src/video/windows/SDL_windowsmodes.c
index 1eb6cb70e..412f967e4 100644
--- a/src/video/windows/SDL_windowsmodes.c
+++ b/src/video/windows/SDL_windowsmodes.c
@@ -171,7 +171,7 @@ WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEX *info)
display.desktop_mode = mode;
display.current_mode = mode;
display.driverdata = displaydata;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
SDL_free(display.name);
return SDL_TRUE;
}
diff --git a/src/video/winrt/SDL_winrtvideo.cpp b/src/video/winrt/SDL_winrtvideo.cpp
index 37b2ecefb..99a52f39d 100644
--- a/src/video/winrt/SDL_winrtvideo.cpp
+++ b/src/video/winrt/SDL_winrtvideo.cpp
@@ -293,7 +293,7 @@ WINRT_AddDisplaysForOutput (_THIS, IDXGIAdapter1 * dxgiAdapter1, int outputIndex
}
}
- if (SDL_AddVideoDisplay(&display) < 0) {
+ if (SDL_AddVideoDisplay(&display, SDL_FALSE) < 0) {
goto done;
}
@@ -376,7 +376,7 @@ WINRT_AddDisplaysForAdapter (_THIS, IDXGIFactory2 * dxgiFactory2, int adapterInd
display.desktop_mode = mode;
display.current_mode = mode;
if ((SDL_AddDisplayMode(&display, &mode) < 0) ||
- (SDL_AddVideoDisplay(&display) < 0))
+ (SDL_AddVideoDisplay(&display, SDL_FALSE) < 0))
{
return SDL_SetError("Failed to apply DXGI Display-detection workaround");
}
diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c
index 5e32d10b3..79ad2472c 100644
--- a/src/video/x11/SDL_x11modes.c
+++ b/src/video/x11/SDL_x11modes.c
@@ -487,7 +487,7 @@ X11_InitModes_XRandR(_THIS)
display.desktop_mode = mode;
display.current_mode = mode;
display.driverdata = displaydata;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
}
X11_XRRFreeScreenResources(res);
@@ -807,7 +807,7 @@ X11_InitModes(_THIS)
display.desktop_mode = mode;
display.current_mode = mode;
display.driverdata = displaydata;
- SDL_AddVideoDisplay(&display);
+ SDL_AddVideoDisplay(&display, SDL_FALSE);
}
#if SDL_VIDEO_DRIVER_X11_XINERAMA