diff --git a/include/SDL_video.h b/include/SDL_video.h index bb2d6d9d8..a625275ed 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -269,6 +269,15 @@ extern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void); */ extern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void); +/** + * \brief Get the name of a display in UTF-8 encoding + * + * \return The name of a display, or NULL for an invalid display index. + * + * \sa SDL_GetNumVideoDisplays() + */ +extern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex); + /** * \brief Get the desktop area represented by a display, with the primary * display located at 0,0 diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 9ada93cc2..4827cf4fd 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -109,6 +109,7 @@ struct SDL_Window */ struct SDL_VideoDisplay { + char *name; int max_display_modes; int num_display_modes; SDL_DisplayMode *display_modes; diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 598f518e2..dfa63d09a 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -581,6 +581,15 @@ SDL_AddVideoDisplay(const SDL_VideoDisplay * display) displays[index] = *display; displays[index].device = _this; _this->displays = displays; + + if (display->name) { + displays[index].name = SDL_strdup(display->name); + } else { + char name[32]; + + SDL_itoa(index, name, 10); + displays[index].name = SDL_strdup(name); + } } else { SDL_OutOfMemory(); } @@ -612,6 +621,14 @@ SDL_GetIndexOfDisplay(SDL_VideoDisplay *display) return 0; } +const char * +SDL_GetDisplayName(int displayIndex) +{ + CHECK_DISPLAY_INDEX(displayIndex, NULL); + + return _this->displays[displayIndex].name; +} + int SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect) { @@ -2195,8 +2212,12 @@ SDL_VideoQuit(void) } } if (_this->displays) { + for (i = 0; i < _this->num_displays; ++i) { + SDL_free(_this->displays[i].name); + } SDL_free(_this->displays); _this->displays = NULL; + _this->num_displays = 0; } if (_this->clipboard_text) { SDL_free(_this->clipboard_text); diff --git a/src/video/cocoa/SDL_cocoamodes.m b/src/video/cocoa/SDL_cocoamodes.m index 3de8d4da7..2459b494c 100644 --- a/src/video/cocoa/SDL_cocoamodes.m +++ b/src/video/cocoa/SDL_cocoamodes.m @@ -24,6 +24,9 @@ #include "SDL_cocoavideo.h" +/* We need this for IODisplayCreateInfoDictionary and kIODisplayOnlyPreferredName */ +#include + /* we need this for ShowMenuBar() and HideMenuBar(). */ #include @@ -217,6 +220,18 @@ Cocoa_ReleaseDisplayModeList(_THIS, CFArrayRef modelist) #endif } +static char * +Cocoa_GetDisplayName(CGDirectDisplayID displayID) +{ + NSDictionary *deviceInfo = (NSDictionary *)IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), kIODisplayOnlyPreferredName); + NSDictionary *localizedNames = [deviceInfo objectForKey:[NSString stringWithUTF8String:kDisplayProductName]]; + + if ([localizedNames count] > 0) { + return [[localizedNames objectForKey:[[localizedNames allKeys] objectAtIndex:0]] UTF8String]; + } + return NULL; +} + void Cocoa_InitModes(_THIS) { @@ -284,6 +299,7 @@ Cocoa_InitModes(_THIS) displaydata->display = displays[i]; SDL_zero(display); + display.name = Cocoa_GetDisplayName(displays[i]); if (!GetDisplayMode (_this, moderef, &mode)) { Cocoa_ReleaseDisplayMode(_this, moderef); SDL_free(displaydata); diff --git a/test/testwm2.c b/test/testwm2.c index 48a57e8ee..850b97a79 100644 --- a/test/testwm2.c +++ b/test/testwm2.c @@ -83,11 +83,11 @@ main(int argc, char *argv[]) if (event.window.event == SDL_WINDOWEVENT_MOVED) { SDL_Window *window = SDL_GetWindowFromID(event.window.windowID); if (window) { - printf("Window %d moved to %d,%d (display %d)\n", + printf("Window %d moved to %d,%d (display %s)\n", event.window.windowID, event.window.data1, event.window.data2, - SDL_GetWindowDisplayIndex(window)); + SDL_GetDisplayName(SDL_GetWindowDisplayIndex(window))); } } }