summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2011-11-19 13:13:58 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2011-11-19 13:13:58 +0800
commitdb618dd4728ccbc28d729221a04a64b39df7936d (patch)
tree71a8c35e3e3a6612fefb0bef9576287164ea0ee6
parentdc1aea3333e79bc87fa4fe03c00a703d4f2f7fc0 (diff)
SexyAppFramework: Fixed a hang which reinitializing the display
-rw-r--r--osframework/source/SexyAppFramework/GLXDisplay.cpp30
-rw-r--r--osframework/source/SexyAppFramework/GLXDisplay.h1
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);
};