From 9bf4c10a441272a6a71bd6389ee199227eb5b105 Mon Sep 17 00:00:00 2001 From: cxl Date: Mon, 27 Dec 2010 18:04:59 +0000 Subject: [PATCH] *CtrlCore: X11 fixed TopWindow Maximize, IsMaximized, Minimize, IsMinimized, SerializePlacement and FullScreen of already open TopWindow git-svn-id: svn://ultimatepp.org/upp/trunk@2938 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/Vcont.hpp | 2 +- uppsrc/CtrlCore/TopWin32.cpp | 6 ++++ uppsrc/CtrlCore/TopWinX11.cpp | 62 ++++++++++++++++++++++++++++------- uppsrc/CtrlCore/TopWindow.cpp | 6 ++++ uppsrc/CtrlCore/TopWindow.h | 2 +- 5 files changed, 65 insertions(+), 13 deletions(-) diff --git a/uppsrc/Core/Vcont.hpp b/uppsrc/Core/Vcont.hpp index c256d7ca1..61c6d7fc1 100644 --- a/uppsrc/Core/Vcont.hpp +++ b/uppsrc/Core/Vcont.hpp @@ -395,7 +395,7 @@ template void Array::Move(int i1, int i2) { void *q = vector[i1]; vector.Remove(i1); - vector.Insert(i2 - (i2 > i1)) = q; + vector.Insert(i2 - (i2 > i1)) = (T*)q; } template diff --git a/uppsrc/CtrlCore/TopWin32.cpp b/uppsrc/CtrlCore/TopWin32.cpp index 50b85d1c2..5be9e40b5 100644 --- a/uppsrc/CtrlCore/TopWin32.cpp +++ b/uppsrc/CtrlCore/TopWin32.cpp @@ -227,6 +227,12 @@ void TopWindow::Minimize(bool effect) #endif } +TopWindow& TopWindow::FullScreen(bool b = true) +{ + fullscreen = b; + return *this; +} + void TopWindow::Maximize(bool effect) { state = MAXIMIZED; diff --git a/uppsrc/CtrlCore/TopWinX11.cpp b/uppsrc/CtrlCore/TopWinX11.cpp index e14a7ddb4..f98ecda93 100644 --- a/uppsrc/CtrlCore/TopWinX11.cpp +++ b/uppsrc/CtrlCore/TopWinX11.cpp @@ -54,6 +54,18 @@ void TopWindow::EventProc(XWindow& w, XEvent *event) LLOG("Unknown WM_PROTOCOLS: " << XAtomName(a)); } } + else + if(event->type == PropertyNotify && event->xproperty.atom == XAtom("_NET_WM_STATE")) { + Vector p = GetPropertyInts(GetWindow(), XAtom("_NET_WM_STATE")); + if(FindIndex(p, XAtom("_NET_WM_STATE_HIDDEN")) >= 0) + state = MINIMIZED; + else + if(FindIndex(p, XAtom("_NET_WM_STATE_MAXIMIZED_HORZ")) >= 0 && + FindIndex(p, XAtom("_NET_WM_STATE_MAXIMIZED_VERT")) >= 0) + state = MAXIMIZED; + else + state = OVERLAPPED; + } if(this_) Ctrl::EventProc(w, event); if(this_) SyncSizeHints(); } @@ -87,6 +99,21 @@ void TopWindow::SyncTitle0() LLOG("*SyncTitle: " << title); } +void WmState(Window w, bool set, Atom a1, Atom a2 = 0) +{ + XEvent e; + memset(&e, 0, sizeof(e)); + e.xclient.type = ClientMessage; + e.xclient.message_type = XAtom("_NET_WM_STATE"); + e.xclient.display = Xdisplay; + e.xclient.window = w; + e.xclient.format = 32; + e.xclient.data.l[0] = set; + e.xclient.data.l[1] = a1; + e.xclient.data.l[2] = a2; + XSendEvent(Xdisplay, Xroot, false, SubstructureNotifyMask | SubstructureRedirectMask, &e); +} + void TopWindow::SyncCaption0() { GuiLock __; @@ -94,6 +121,7 @@ void TopWindow::SyncCaption0() SyncTitle(); if(IsOpen() && GetWindow()) { unsigned long wina[6]; + memset(wina, 0, sizeof(wina)); int n = 0; Window w = GetWindow(); if(tool) @@ -104,16 +132,18 @@ void TopWindow::SyncCaption0() XChangeProperty(Xdisplay, GetWindow(), XAtom("_NET_WM_WINDOW_TYPE"), XAtom("ATOM"), 32, PropModeReplace, (const unsigned char *)wina, n); n = 0; - if(topmost) - wina[n++] = XAtom("_NET_WM_STATE_ABOVE"); - if(state == MAXIMIZED) { - wina[n++] = XAtom("_NET_WM_STATE_MAXIMIZED_HORZ"); - wina[n++] = XAtom("_NET_WM_STATE_MAXIMIZED_VERT"); - } - if(fullscreen) - wina[n++] = XAtom("_NET_WM_STATE_FULLSCREEN"); - XChangeProperty(Xdisplay, GetWindow(), XAtom("_NET_WM_STATE"), XAtom("ATOM"), 32, - PropModeReplace, (const unsigned char *)wina, n); + WmState(w, topmost, XAtom("_NET_WM_STATE_ABOVE")); + WmState(w, state == MAXIMIZED, XAtom("_NET_WM_STATE_MAXIMIZED_HORZ"), XAtom("_NET_WM_STATE_MAXIMIZED_VERT")); + if(state == MINIMIZED) + XIconifyWindow(Xdisplay, GetWindow(), Xscreenno); + else + XMapWindow(Xdisplay, GetWindow()); + + WmState(w, state == MINIMIZED, XAtom("_NET_WM_STATE_HIDDEN")); + WmState(w, fullscreen, XAtom("_NET_WM_STATE_FULLSCREEN")); + +// XChangeProperty(Xdisplay, GetWindow(), XAtom("_NET_WM_STATE"), XAtom("ATOM"), 32, +// PropModeReplace, (const unsigned char *)wina, n); wm_hints->flags = InputHint|WindowGroupHint|StateHint; wm_hints->initial_state = NormalState; wm_hints->input = XTrue; @@ -279,19 +309,29 @@ void TopWindow::Minimize(bool) { GuiLock __; state = MINIMIZED; - XIconifyWindow(Xdisplay, GetWindow(), Xscreenno); + SyncCaption0(); } void TopWindow::Maximize(bool effect) { GuiLock __; state = MAXIMIZED; + SyncCaption0(); } void TopWindow::Overlap(bool effect) { GuiLock __; state = OVERLAPPED; + SyncCaption0(); +} + +TopWindow& TopWindow::FullScreen(bool b) +{ + GuiLock __; + fullscreen = b; + SyncCaption0(); + return *this; } TopWindow& TopWindow::TopMost(bool b, bool) diff --git a/uppsrc/CtrlCore/TopWindow.cpp b/uppsrc/CtrlCore/TopWindow.cpp index ecfed060d..52d248a44 100644 --- a/uppsrc/CtrlCore/TopWindow.cpp +++ b/uppsrc/CtrlCore/TopWindow.cpp @@ -475,6 +475,12 @@ void TopWindow::SerializePlacement(Stream& s, bool reminimize) ::ShowWindow(hwnd, SW_RESTORE); break; } + #endif + #ifdef PLATFORM_X11 + if(state == MINIMIZED) + Minimize(false); + if(state == MAXIMIZED) + Maximize(false); #endif } } diff --git a/uppsrc/CtrlCore/TopWindow.h b/uppsrc/CtrlCore/TopWindow.h index 5d603c1af..da3076148 100644 --- a/uppsrc/CtrlCore/TopWindow.h +++ b/uppsrc/CtrlCore/TopWindow.h @@ -199,7 +199,7 @@ public: TopWindow& TopMost(bool b = true, bool stay_top = true); TopWindow& NoTopMost() { return TopMost(false); } bool IsTopMost() const; - TopWindow& FullScreen(bool b = true) { fullscreen = b; return *this; } + TopWindow& FullScreen(bool b = true); bool IsFullScreen() const { return fullscreen; } TopWindow& FrameLess(bool b = true) { frameless = b; return *this; } bool IsFrameLess() const { return frameless; }