From 4b5e2214a79aa53131004176ce57294daab842ce Mon Sep 17 00:00:00 2001 From: stopiccot Date: Sun, 18 Nov 2012 15:45:12 +0300 Subject: [PATCH] SetMinimumWindowSize for OS X --- .hgignore | 4 +++ include/SDL_video.h | 19 +++++++++++ src/video/SDL_sysvideo.h | 2 ++ src/video/SDL_video.c | 52 ++++++++++++++++++++++++------- src/video/cocoa/SDL_cocoavideo.m | 1 + src/video/cocoa/SDL_cocoawindow.h | 1 + src/video/cocoa/SDL_cocoawindow.m | 15 +++++++++ 7 files changed, 82 insertions(+), 12 deletions(-) diff --git a/.hgignore b/.hgignore index 06e0353b0..e9385b290 100644 --- a/.hgignore +++ b/.hgignore @@ -23,6 +23,10 @@ build *.pbxuser (^|/)build($|/) .DS_Store +Xcode/SDL/SDL.xcodeproj/xcuserdata +Xcode/SDL/SDL.xcodeproj/project.xcworkspace/xcuserdata +Xcode/SDL/SDLTest.xcodeproj/xcuserdata +Xcode/SDL/SDLTest.xcodeproj/project.xcworkspace/xcuserdata # for Visual C++ Debug diff --git a/include/SDL_video.h b/include/SDL_video.h index f93117fcf..5fdba063f 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -517,6 +517,25 @@ extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, */ extern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_Window * window, int *w, int *h); + +/** + * \brief Set the minimum size of a window's client area. + * + * \note You can't change the minimum size of a fullscreen window, it + * automatically matches the size of the display mode. + * + * \sa SDL_GetWindowMinimumSize() + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMinimumSize(SDL_Window * window, + int min_w, int min_h); + +/** + * \brief Get the minimum size of a window's client area. + * + * \sa SDL_SetWindowMinimumSize() + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMinimumSize(SDL_Window * window, + int *w, int *h); /** * \brief Set the border state of a window. diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 5060a358b..830426603 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -74,6 +74,7 @@ struct SDL_Window char *title; int x, y; int w, h; + int min_w, min_h; Uint32 flags; /* Stored position and size for windowed mode */ @@ -181,6 +182,7 @@ struct SDL_VideoDevice void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon); void (*SetWindowPosition) (_THIS, SDL_Window * window); void (*SetWindowSize) (_THIS, SDL_Window * window); + void (*SetWindowMinimumSize) (_THIS, SDL_Window * window); void (*ShowWindow) (_THIS, SDL_Window * window); void (*HideWindow) (_THIS, SDL_Window * window); void (*RaiseWindow) (_THIS, SDL_Window * window); diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index b6f585118..e3109481e 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1563,19 +1563,47 @@ SDL_GetWindowSize(SDL_Window * window, int *w, int *h) CHECK_WINDOW_MAGIC(window, ); if (_this && window && window->magic == &_this->window_magic) { - if (w) { - *w = window->w; - } - if (h) { - *h = window->h; - } - } else { - if (w) { - *w = 0; - } - if (h) { - *h = 0; + *w = window->w; + *h = window->h; + } +} + +void +SDL_SetWindowMinimumSize(SDL_Window * window, int min_w, int min_h) +{ + CHECK_WINDOW_MAGIC(window, ); + + if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { + window->min_w = min_w; + window->min_h = min_h; + if (_this->SetWindowMinimumSize) { + _this->SetWindowMinimumSize(_this, window); } + /* Ensure that window is not smaller than minimal size */ + SDL_SetWindowSize(window, SDL_max(window->w, window->min_w), SDL_max(window->h, window->min_h)); + } +} + +void +SDL_GetWindowMinimumSize(SDL_Window * window, int *min_w, int *min_h) +{ + int dummy; + + if (!min_w) { + min_w = &dummy; + } + if (!min_h) { + min_h = &dummy; + } + + *min_w = 0; + *min_h = 0; + + CHECK_WINDOW_MAGIC(window, ); + + if (_this && window && window->magic == &_this->window_magic) { + *min_w = window->min_w; + *min_h = window->min_h; } } diff --git a/src/video/cocoa/SDL_cocoavideo.m b/src/video/cocoa/SDL_cocoavideo.m index 4ada3b985..391cc2fad 100644 --- a/src/video/cocoa/SDL_cocoavideo.m +++ b/src/video/cocoa/SDL_cocoavideo.m @@ -95,6 +95,7 @@ device->SetWindowIcon = Cocoa_SetWindowIcon; device->SetWindowPosition = Cocoa_SetWindowPosition; device->SetWindowSize = Cocoa_SetWindowSize; + device->SetWindowMinimumSize = Cocoa_SetWindowMinimumSize; device->ShowWindow = Cocoa_ShowWindow; device->HideWindow = Cocoa_HideWindow; device->RaiseWindow = Cocoa_RaiseWindow; diff --git a/src/video/cocoa/SDL_cocoawindow.h b/src/video/cocoa/SDL_cocoawindow.h index d17604d71..9c8149ef5 100644 --- a/src/video/cocoa/SDL_cocoawindow.h +++ b/src/video/cocoa/SDL_cocoawindow.h @@ -94,6 +94,7 @@ extern void Cocoa_SetWindowTitle(_THIS, SDL_Window * window); extern void Cocoa_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); extern void Cocoa_SetWindowPosition(_THIS, SDL_Window * window); extern void Cocoa_SetWindowSize(_THIS, SDL_Window * window); +extern void Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window); extern void Cocoa_ShowWindow(_THIS, SDL_Window * window); extern void Cocoa_HideWindow(_THIS, SDL_Window * window); extern void Cocoa_RaiseWindow(_THIS, SDL_Window * window); diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index dc1a85096..cf880325d 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -730,6 +730,21 @@ - (void)rightMouseDown:(NSEvent *)theEvent [pool release]; } +void +Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + SDL_WindowData *windata = (SDL_WindowData *) window->driverdata; + + NSSize minSize; + minSize.width = window->min_w; + minSize.height = window->min_h; + + [windata->nswindow setMinSize:minSize]; + + [pool release]; +} + void Cocoa_ShowWindow(_THIS, SDL_Window * window) {