diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2011-11-19 13:13:58 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2011-11-19 13:13:58 +0800 |
commit | db618dd4728ccbc28d729221a04a64b39df7936d (patch) | |
tree | 71a8c35e3e3a6612fefb0bef9576287164ea0ee6 | |
parent | dc1aea3333e79bc87fa4fe03c00a703d4f2f7fc0 (diff) |
SexyAppFramework: Fixed a hang which reinitializing the display
-rw-r--r-- | osframework/source/SexyAppFramework/GLXDisplay.cpp | 30 | ||||
-rw-r--r-- | osframework/source/SexyAppFramework/GLXDisplay.h | 1 |
2 files changed, 19 insertions, 12 deletions
diff --git a/osframework/source/SexyAppFramework/GLXDisplay.cpp b/osframework/source/SexyAppFramework/GLXDisplay.cpp index f1b1d4b..2be9258 100644 --- a/osframework/source/SexyAppFramework/GLXDisplay.cpp +++ b/osframework/source/SexyAppFramework/GLXDisplay.cpp @@ -26,6 +26,7 @@ GLXDisplay::GLXDisplay (SexyAppBase* theApp) mContext = NULL; mWidth = mApp->mWidth; mHeight = mApp->mHeight; + mIsWindowed = false; } GLXDisplay::~GLXDisplay () @@ -145,6 +146,7 @@ int GLXDisplay::Init (void) wmState = XInternAtom (mDpy, "_NET_WM_STATE", False); fullScreen = XInternAtom (mDpy, "_NET_WM_STATE_FULLSCREEN", False); + mIsWindowed = mApp->mIsWindowed; if (!mApp->mIsWindowed) { memset(&event, 0, sizeof(event)); @@ -242,18 +244,22 @@ bool GLXDisplay::Reinit (void) wmState = XInternAtom (mDpy, "_NET_WM_STATE", False); fullScreen = XInternAtom (mDpy, "_NET_WM_STATE_FULLSCREEN", False); - memset(&event, 0, sizeof(event)); - event.type = ClientMessage; - event.xclient.window = mWindow; - event.xclient.message_type = wmState; - event.xclient.format = 32; - event.xclient.data.l[0] = mApp->mIsWindowed ? 0 : 1; - event.xclient.data.l[1] = fullScreen; - event.xclient.data.l[2] = 0; - - XSendEvent (mDpy, DefaultRootWindow (mDpy), False, - SubstructureNotifyMask, &event); - XIfEvent (mDpy, &event, WaitForSubstructureNotify, (char*)this); + if (mApp->mIsWindowed != mIsWindowed) + { + memset(&event, 0, sizeof(event)); + event.type = ClientMessage; + event.xclient.window = mWindow; + event.xclient.message_type = wmState; + event.xclient.format = 32; + event.xclient.data.l[0] = mApp->mIsWindowed ? 0 : 1; + event.xclient.data.l[1] = fullScreen; + event.xclient.data.l[2] = 0; + + XSendEvent (mDpy, DefaultRootWindow (mDpy), False, + SubstructureNotifyMask, &event); + XIfEvent (mDpy, &event, WaitForSubstructureNotify, (char*)this); + } + mIsWindowed = mApp->mIsWindowed; delete mScreenImage; mScreenImage = static_cast<GLImage*>(CreateImage (mApp, mWidth, mHeight)); diff --git a/osframework/source/SexyAppFramework/GLXDisplay.h b/osframework/source/SexyAppFramework/GLXDisplay.h index b082017..e40dece 100644 --- a/osframework/source/SexyAppFramework/GLXDisplay.h +++ b/osframework/source/SexyAppFramework/GLXDisplay.h @@ -51,6 +51,7 @@ private: Atom mWMDeleteMessage; + bool mIsWindowed; static Bool WaitForSubstructureNotify(Display *d, XEvent *e, char* arg); }; |