From 9444c11e99f3e480e006e6f37acf43f97932bbb3 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 9 Aug 2013 23:13:52 -0700 Subject: [PATCH] Fixed bug 2007 - SDL_SetWindowMinimumSize() not implemented on X11 (thanks Rainer!) --- src/video/x11/SDL_x11video.c | 2 ++ src/video/x11/SDL_x11window.c | 59 +++++++++++++++++++++++++++++++++++ src/video/x11/SDL_x11window.h | 2 ++ 3 files changed, 63 insertions(+) diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index d12f87a7b..86597ecf2 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -362,6 +362,8 @@ X11_CreateDevice(int devindex) device->SetWindowIcon = X11_SetWindowIcon; device->SetWindowPosition = X11_SetWindowPosition; device->SetWindowSize = X11_SetWindowSize; + device->SetWindowMinimumSize = X11_SetWindowMinimumSize; + device->SetWindowMaximumSize = X11_SetWindowMaximumSize; device->ShowWindow = X11_ShowWindow; device->HideWindow = X11_HideWindow; device->RaiseWindow = X11_RaiseWindow; diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 078ca3014..e101bec0c 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -741,6 +741,64 @@ X11_SetWindowPosition(_THIS, SDL_Window * window) XFlush(display); } +void +X11_SetWindowMinimumSize(_THIS, SDL_Window * window) +{ + SDL_WindowData *data = (SDL_WindowData *) window->driverdata; + Display *display = data->videodata->display; + + if (window->flags & SDL_WINDOW_RESIZABLE) { + XSizeHints *sizehints = XAllocSizeHints(); + long userhints; + + XGetWMNormalHints(display, data->xwindow, sizehints, &userhints); + + sizehints->min_width = window->min_w; + sizehints->min_height = window->min_h; + sizehints->flags |= PMinSize; + + XSetWMNormalHints(display, data->xwindow, sizehints); + + XFree(sizehints); + + /* See comment in X11_SetWindowSize. */ + XResizeWindow(display, data->xwindow, window->w, window->h); + XMoveWindow(display, data->xwindow, window->x, window->y); + XRaiseWindow(display, data->xwindow); + } + + XFlush(display); +} + +void +X11_SetWindowMaximumSize(_THIS, SDL_Window * window) +{ + SDL_WindowData *data = (SDL_WindowData *) window->driverdata; + Display *display = data->videodata->display; + + if (window->flags & SDL_WINDOW_RESIZABLE) { + XSizeHints *sizehints = XAllocSizeHints(); + long userhints; + + XGetWMNormalHints(display, data->xwindow, sizehints, &userhints); + + sizehints->max_width = window->max_w; + sizehints->max_height = window->max_h; + sizehints->flags |= PMaxSize; + + XSetWMNormalHints(display, data->xwindow, sizehints); + + XFree(sizehints); + + /* See comment in X11_SetWindowSize. */ + XResizeWindow(display, data->xwindow, window->w, window->h); + XMoveWindow(display, data->xwindow, window->x, window->y); + XRaiseWindow(display, data->xwindow); + } + + XFlush(display); +} + void X11_SetWindowSize(_THIS, SDL_Window * window) { @@ -760,6 +818,7 @@ X11_SetWindowSize(_THIS, SDL_Window * window) sizehints->min_width = sizehints->max_width = window->w; sizehints->min_height = sizehints->max_height = window->h; + sizehints->flags |= PMinSize | PMaxSize; XSetWMNormalHints(display, data->xwindow, sizehints); diff --git a/src/video/x11/SDL_x11window.h b/src/video/x11/SDL_x11window.h index b9cb750b6..f53fd8aa2 100644 --- a/src/video/x11/SDL_x11window.h +++ b/src/video/x11/SDL_x11window.h @@ -70,6 +70,8 @@ extern char *X11_GetWindowTitle(_THIS, Window xwindow); extern void X11_SetWindowTitle(_THIS, SDL_Window * window); extern void X11_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon); extern void X11_SetWindowPosition(_THIS, SDL_Window * window); +extern void X11_SetWindowMinimumSize(_THIS, SDL_Window * window); +extern void X11_SetWindowMaximumSize(_THIS, SDL_Window * window); extern void X11_SetWindowSize(_THIS, SDL_Window * window); extern void X11_ShowWindow(_THIS, SDL_Window * window); extern void X11_HideWindow(_THIS, SDL_Window * window);