Finished implementing maximize for linux.

Added FloatingContainerForc*TitleBar to switch between native and custom titlebar.

Co-authored-by: SleepProgger <SleepProgger@users.noreply.github.com>
This commit is contained in:
helywin
2019-09-12 10:44:12 +08:00
committed by Some Guy
parent 48fb999bd0
commit 533d174abc
10 changed files with 533 additions and 37 deletions

View File

@@ -368,8 +368,6 @@ void DockManagerPrivate::restoreDockAreasIndices()
}
}
//============================================================================
void DockManagerPrivate::emitTopLevelEvents()
{
@@ -476,6 +474,10 @@ CDockManager::CDockManager(QWidget *parent) :
{
d->FocusController = new CDockFocusController(this);
}
#ifdef Q_OS_LINUX
window()->installEventFilter(this);
#endif
}
//============================================================================
@@ -489,6 +491,53 @@ CDockManager::~CDockManager()
delete d;
}
//============================================================================
#ifdef Q_OS_LINUX
bool CDockManager::eventFilter(QObject *obj, QEvent *e){
// Emulate Qt:Tool behaviour.
// Required because on some WMs Tool windows can't be maximized.
// Window always on top of the MainWindow.
if(e->type() == QEvent::WindowActivate){
for(auto _window : floatingWidgets()){
if(!_window->isVisible() || window()->isMinimized()){
continue;
}
// setWindowFlags(Qt::WindowStaysOnTopHint) will hide the window and thus requires a show call.
// This then leads to flickering and a nasty endless loop (also buggy behaviour on Ubuntu).
// So we just do it ourself.
internal::xcb_update_prop(true, _window->window()->winId(), "_NET_WM_STATE", "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_STAYS_ON_TOP");
}
}
else if(e->type() == QEvent::WindowDeactivate){
for(auto _window : floatingWidgets()){
if(!_window->isVisible() || window()->isMinimized()){
continue;
}
internal::xcb_update_prop(false, _window->window()->winId(), "_NET_WM_STATE", "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_STAYS_ON_TOP");
_window->raise();
}
}
// Sync minimize with MainWindow
if(e->type() == QEvent::WindowStateChange){
for(auto _window : floatingWidgets()){
if(! _window->isVisible()){
continue;
}
if(window()->isMinimized()){
_window->showMinimized();
} else {
_window->setWindowState(_window->windowState() & (~Qt::WindowMinimized));
}
}
if(!window()->isMinimized()){
QApplication::setActiveWindow(window());
}
}
return Super::eventFilter(obj, e);
}
#endif
//============================================================================
void CDockManager::registerFloatingWidget(CFloatingDockContainer* FloatingWidget)