mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
*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
This commit is contained in:
parent
a5a273c712
commit
9bf4c10a44
5 changed files with 65 additions and 13 deletions
|
|
@ -395,7 +395,7 @@ template <class T>
|
|||
void Array<T>::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 <class T>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<int> 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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue