From 94b9e452ebd9438a917b825d8d01137ddaa9e398 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 29 Apr 2012 03:27:05 +0000 Subject: Implement resizable and non-resizable windows. --- pugl/pugl.h | 7 ++++++- pugl/pugl_win.cpp | 6 +++++- pugl/pugl_x11.c | 19 ++++++++++++++++++- pugl_test.c | 3 ++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/pugl/pugl.h b/pugl/pugl.h index 6a6fbe7..a764620 100644 --- a/pugl/pugl.h +++ b/pugl/pugl.h @@ -62,9 +62,14 @@ typedef void (*PuglReshapeFunc)(PuglWindow* handle, int width, int height); @param title Window title, or NULL. @param width Window width in pixels. @param height Window height in pixels. + @param resizable Whether window should be user resizable. */ PuglWindow* -puglCreate(PuglNativeWindow parent, const char* title, int width, int height); +puglCreate(PuglNativeWindow parent, + const char* title, + int width, + int height, + bool resizable); /** Set the handle to be passed to all callbacks. diff --git a/pugl/pugl_win.cpp b/pugl/pugl_win.cpp index 50f42f0..63c6051 100644 --- a/pugl/pugl_win.cpp +++ b/pugl/pugl_win.cpp @@ -29,7 +29,11 @@ struct PuglPlatformDataImpl { }; PuglWindow* -puglCreate(PuglNativeWindow parent, const char* title, int width, int height) +puglCreate(PuglNativeWindow parent, + const char* title, + int width, + int height, + bool resizable) { PuglWindow* win = (PuglWindow*)calloc(1, sizeof(PuglWindow)); diff --git a/pugl/pugl_x11.c b/pugl/pugl_x11.c index 5844f2d..f85e18b 100644 --- a/pugl/pugl_x11.c +++ b/pugl/pugl_x11.c @@ -62,7 +62,11 @@ static int attrListDbl[] = { }; PuglWindow* -puglCreate(PuglNativeWindow parent, const char* title, int width, int height) +puglCreate(PuglNativeWindow parent, + const char* title, + int width, + int height, + bool resizable) { PuglWindow* win = (PuglWindow*)calloc(1, sizeof(PuglWindow)); @@ -112,6 +116,17 @@ puglCreate(PuglNativeWindow parent, const char* title, int width, int height) 0, 0, win->width, win->height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &attr); + XSizeHints sizeHints; + memset(&sizeHints, 0, sizeof(sizeHints)); + if (!resizable) { + sizeHints.flags = PMinSize|PMaxSize; + sizeHints.min_width = width; + sizeHints.min_height = height; + sizeHints.max_width = width; + sizeHints.max_height = height; + XSetNormalHints(impl->display, impl->win, &sizeHints); + } + if (title) { XStoreName(impl->display, impl->win, title); } @@ -187,6 +202,8 @@ puglProcessEvents(PuglWindow* win) event.xconfigure.width, event.xconfigure.height); } + win->width = event.xconfigure.width; + win->height = event.xconfigure.height; } break; case MotionNotify: diff --git a/pugl_test.c b/pugl_test.c index 63bc7d6..c209aef 100644 --- a/pugl_test.c +++ b/pugl_test.c @@ -89,7 +89,8 @@ onClose(PuglWindow* win) int main(int argc, char** argv) { - PuglWindow* win = puglCreate(0, "Pugl Test", 512, 512); + bool resizable = argc > 1; + PuglWindow* win = puglCreate(0, "Pugl Test", 512, 512, resizable); puglSetKeyboardFunc(win, onKeyboard); puglSetMotionFunc(win, onMotion); puglSetMouseFunc(win, onMouse); -- cgit v1.2.1