[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kwin] /: Move X11 specific Workspace initialization code into dedicated method
From: Martin_Flöser <null () kde ! org>
Date: 2017-09-30 11:05:26
Message-ID: E1dyFaI-0003d2-Iy () code ! kde ! org
[Download RAW message or body]
Git commit 5cbd28f9a0d4a5e94eab0434493e47cd7b650fe1 by Martin Flöser.
Committed on 30/09/2017 at 11:03.
Pushed by graesslin into branch 'master'.
Move X11 specific Workspace initialization code into dedicated method
Summary:
This is required to start KWin/Wayland without XWayland support or
delayed XWayland support.
Test Plan: Run kwin_x11 in a nested Xephyr
Reviewers: #kwin, #plasma
Subscribers: plasma-devel, kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D7897
M +0 -3 main.cpp
M +139 -115 workspace.cpp
M +1 -0 workspace.h
https://commits.kde.org/kwin/5cbd28f9a0d4a5e94eab0434493e47cd7b650fe1
diff --git a/main.cpp b/main.cpp
index 7e15528e7..765c2af51 100644
--- a/main.cpp
+++ b/main.cpp
@@ -268,9 +268,6 @@ void Application::notifyKSplash()
void Application::createWorkspace()
{
- // ensure the helper atoms are retrieved before we create the Workspace
- atoms->retrieveHelpers();
-
// we want all QQuickWindows with an alpha buffer, do here as Workspace might \
create QQuickWindows QQuickWindow::setDefaultAlphaBuffer(true);
diff --git a/workspace.cpp b/workspace.cpp
index 8610f79e4..2dc16a31f 100644
--- a/workspace.cpp
+++ b/workspace.cpp
@@ -133,9 +133,6 @@ Workspace::Workspace(const QString &sessionKey)
_self = this;
- // first initialize the extensions
- Xcb::Extensions::self();
-
#ifdef KWIN_BUILD_ACTIVITIES
Activities *activities = nullptr;
if (kwinApp()->usesKActivities()) {
@@ -151,8 +148,6 @@ Workspace::Workspace(const QString &sessionKey)
options->loadConfig();
options->loadCompositingConfig(false);
- ColorMapper *colormaps = new ColorMapper(this);
- connect(this, &Workspace::clientActivated, colormaps, &ColorMapper::update);
delayFocusTimer = 0;
@@ -163,13 +158,6 @@ Workspace::Workspace(const QString &sessionKey)
RuleBook::create(this)->load();
- // Call this before XSelectInput() on the root window
- startup = new KStartupInfo(
- KStartupInfo::DisableKWinModule | KStartupInfo::AnnounceSilenceChanges, \
this);
-
- // Select windowmanager privileges
- selectWmInputEventMask();
-
ScreenEdges::create(this);
// VirtualDesktopManager needs to be created prior to init shortcuts
@@ -196,12 +184,6 @@ Workspace::Workspace(const QString &sessionKey)
new DBusInterface(this);
- // Compatibility
- int32_t data = 1;
-
- xcb_change_property(connection(), XCB_PROP_MODE_APPEND, rootWindow(), \
atoms->kwin_running,
- atoms->kwin_running, 32, 1, &data);
-
Outline::create(this);
initShortcuts();
@@ -211,11 +193,6 @@ Workspace::Workspace(const QString &sessionKey)
void Workspace::init()
{
- if (kwinApp()->operationMode() == Application::OperationModeX11) {
- m_wasUserInteractionFilter.reset(new WasUserInteractionX11Filter);
- m_movingClientFilter.reset(new MovingClientX11Filter);
- }
- updateXTime(); // Needed for proper initialization of user_time in Client ctor
KSharedConfigPtr config = kwinApp()->config();
kwinApp()->createScreens();
Screens *screens = Screens::self();
@@ -239,12 +216,6 @@ void Workspace::init()
connect(options, SIGNAL(separateScreenFocusChanged(bool)), focusChain, \
SLOT(setSeparateScreenFocus(bool))); \
focusChain->setSeparateScreenFocus(options->isSeparateScreenFocus());
- const uint32_t nullFocusValues[] = {true};
- m_nullFocus.reset(new Xcb::Window(QRect(-1, -1, 1, 1), \
XCB_WINDOW_CLASS_INPUT_ONLY, XCB_CW_OVERRIDE_REDIRECT, \
nullFocusValues));
- m_nullFocus->map();
-
- RootInfo *rootInfo = RootInfo::create();
-
// create VirtualDesktopManager and perform dependency injection
VirtualDesktopManager *vds = VirtualDesktopManager::self();
connect(vds, SIGNAL(desktopsRemoved(uint)), \
SLOT(moveClientsFromRemovedDesktops())); @@ -252,7 +223,6 @@ void Workspace::init()
connect(vds, SIGNAL(currentChanged(uint,uint)), \
SLOT(slotCurrentDesktopChanged(uint,uint))); \
vds->setNavigationWrappingAround(options->isRollOverDesktops());
connect(options, SIGNAL(rollOverDesktopsChanged(bool)), vds, \
SLOT(setNavigationWrappingAround(bool)));
- vds->setRootInfo(rootInfo);
vds->setConfig(config);
// Now we know how many desktops we'll have, thus we initialize the positioning \
object @@ -262,10 +232,6 @@ void Workspace::init()
vds->load();
vds->updateLayout();
- // Extra NETRootInfo instance in Client mode is needed to get the values of the \
properties
- NETRootInfo client_info(connection(), NET::ActiveWindow | NET::CurrentDesktop);
- if (!qApp->isSessionRestored())
- m_initialDesktop = client_info.currentDesktop();
if (!VirtualDesktopManager::self()->setCurrent(m_initialDesktop))
VirtualDesktopManager::self()->setCurrent(1);
@@ -284,87 +250,8 @@ void Workspace::init()
this, SLOT(reconfigure()));
active_client = NULL;
- rootInfo->setActiveWindow(None);
- focusToNull();
- if (!qApp->isSessionRestored())
- ++block_focus; // Because it will be set below
-
- {
- // Begin updates blocker block
- StackingUpdatesBlocker blocker(this);
-
- Xcb::Tree tree(rootWindow());
- xcb_window_t *wins = xcb_query_tree_children(tree.data());
-
- QVector<Xcb::WindowAttributes> windowAttributes(tree->children_len);
- QVector<Xcb::WindowGeometry> windowGeometries(tree->children_len);
-
- // Request the attributes and geometries of all toplevel windows
- for (int i = 0; i < tree->children_len; i++) {
- windowAttributes[i] = Xcb::WindowAttributes(wins[i]);
- windowGeometries[i] = Xcb::WindowGeometry(wins[i]);
- }
-
- // Get the replies
- for (int i = 0; i < tree->children_len; i++) {
- Xcb::WindowAttributes attr(windowAttributes.at(i));
-
- if (attr.isNull()) {
- continue;
- }
-
- if (attr->override_redirect) {
- if (attr->map_state == XCB_MAP_STATE_VIEWABLE &&
- attr->_class != XCB_WINDOW_CLASS_INPUT_ONLY)
- // ### This will request the attributes again
- createUnmanaged(wins[i]);
- } else if (attr->map_state != XCB_MAP_STATE_UNMAPPED) {
- if (Application::wasCrash()) {
- fixPositionAfterCrash(wins[i], windowGeometries.at(i).data());
- }
-
- // ### This will request the attributes again
- createClient(wins[i], true);
- }
- }
-
- // Propagate clients, will really happen at the end of the updates blocker \
block
- updateStackingOrder(true);
- saveOldScreenSizes();
- updateClientArea();
-
- // NETWM spec says we have to set it to (0,0) if we don't support it
- NETPoint* viewports = new NETPoint[VirtualDesktopManager::self()->count()];
- rootInfo->setDesktopViewport(VirtualDesktopManager::self()->count(), \
*viewports);
- delete[] viewports;
- QRect geom;
- for (int i = 0; i < screens->count(); i++) {
- geom |= screens->geometry(i);
- }
- NETSize desktop_geometry;
- desktop_geometry.width = geom.width();
- desktop_geometry.height = geom.height();
- rootInfo->setDesktopGeometry(desktop_geometry);
- setShowingDesktop(false);
-
- } // End updates blocker block
-
- AbstractClient* new_active_client = nullptr;
- if (!qApp->isSessionRestored()) {
- --block_focus;
- new_active_client = findClient(Predicate::WindowMatch, \
client_info.activeWindow());
- }
- if (new_active_client == NULL
- && activeClient() == NULL && should_get_focus.count() == 0) {
- // No client activated in manage()
- if (new_active_client == NULL)
- new_active_client = \
topClientOnDesktop(VirtualDesktopManager::self()->current(), -1);
- if (new_active_client == NULL && !desktops.isEmpty())
- new_active_client = findDesktop(true, \
VirtualDesktopManager::self()->current());
- }
- if (new_active_client != NULL)
- activateClient(new_active_client);
+ initWithX11();
Scripting::create(this);
@@ -461,6 +348,141 @@ void Workspace::init()
// TODO: ungrabXServer()
}
+void Workspace::initWithX11()
+{
+ if (!kwinApp()->x11Connection()) {
+ connect(kwinApp(), &Application::x11ConnectionChanged, this, \
&Workspace::initWithX11, Qt::UniqueConnection); + return;
+ }
+ disconnect(kwinApp(), &Application::x11ConnectionChanged, this, \
&Workspace::initWithX11); +
+ atoms->retrieveHelpers();
+
+ // first initialize the extensions
+ Xcb::Extensions::self();
+ ColorMapper *colormaps = new ColorMapper(this);
+ connect(this, &Workspace::clientActivated, colormaps, &ColorMapper::update);
+
+ // Call this before XSelectInput() on the root window
+ startup = new KStartupInfo(
+ KStartupInfo::DisableKWinModule | KStartupInfo::AnnounceSilenceChanges, \
this); +
+ // Select windowmanager privileges
+ selectWmInputEventMask();
+
+ // Compatibility
+ int32_t data = 1;
+
+ xcb_change_property(connection(), XCB_PROP_MODE_APPEND, rootWindow(), \
atoms->kwin_running, + atoms->kwin_running, 32, 1, &data);
+
+ if (kwinApp()->operationMode() == Application::OperationModeX11) {
+ m_wasUserInteractionFilter.reset(new WasUserInteractionX11Filter);
+ m_movingClientFilter.reset(new MovingClientX11Filter);
+ }
+ updateXTime(); // Needed for proper initialization of user_time in Client ctor
+
+ const uint32_t nullFocusValues[] = {true};
+ m_nullFocus.reset(new Xcb::Window(QRect(-1, -1, 1, 1), \
XCB_WINDOW_CLASS_INPUT_ONLY, XCB_CW_OVERRIDE_REDIRECT, nullFocusValues)); + \
m_nullFocus->map(); +
+ RootInfo *rootInfo = RootInfo::create();
+ VirtualDesktopManager::self()->setRootInfo(rootInfo);
+
+ // TODO: only in X11 mode
+ // Extra NETRootInfo instance in Client mode is needed to get the values of the \
properties + NETRootInfo client_info(connection(), NET::ActiveWindow | \
NET::CurrentDesktop); + if (!qApp->isSessionRestored())
+ m_initialDesktop = client_info.currentDesktop();
+ if (!VirtualDesktopManager::self()->setCurrent(m_initialDesktop))
+ VirtualDesktopManager::self()->setCurrent(1);
+
+ // TODO: better value
+ rootInfo->setActiveWindow(None);
+ focusToNull();
+
+ if (!qApp->isSessionRestored())
+ ++block_focus; // Because it will be set below
+
+ {
+ // Begin updates blocker block
+ StackingUpdatesBlocker blocker(this);
+
+ Xcb::Tree tree(rootWindow());
+ xcb_window_t *wins = xcb_query_tree_children(tree.data());
+
+ QVector<Xcb::WindowAttributes> windowAttributes(tree->children_len);
+ QVector<Xcb::WindowGeometry> windowGeometries(tree->children_len);
+
+ // Request the attributes and geometries of all toplevel windows
+ for (int i = 0; i < tree->children_len; i++) {
+ windowAttributes[i] = Xcb::WindowAttributes(wins[i]);
+ windowGeometries[i] = Xcb::WindowGeometry(wins[i]);
+ }
+
+ // Get the replies
+ for (int i = 0; i < tree->children_len; i++) {
+ Xcb::WindowAttributes attr(windowAttributes.at(i));
+
+ if (attr.isNull()) {
+ continue;
+ }
+
+ if (attr->override_redirect) {
+ if (attr->map_state == XCB_MAP_STATE_VIEWABLE &&
+ attr->_class != XCB_WINDOW_CLASS_INPUT_ONLY)
+ // ### This will request the attributes again
+ createUnmanaged(wins[i]);
+ } else if (attr->map_state != XCB_MAP_STATE_UNMAPPED) {
+ if (Application::wasCrash()) {
+ fixPositionAfterCrash(wins[i], windowGeometries.at(i).data());
+ }
+
+ // ### This will request the attributes again
+ createClient(wins[i], true);
+ }
+ }
+
+ // Propagate clients, will really happen at the end of the updates blocker \
block + updateStackingOrder(true);
+
+ saveOldScreenSizes();
+ updateClientArea();
+
+ // NETWM spec says we have to set it to (0,0) if we don't support it
+ NETPoint* viewports = new NETPoint[VirtualDesktopManager::self()->count()];
+ rootInfo->setDesktopViewport(VirtualDesktopManager::self()->count(), \
*viewports); + delete[] viewports;
+ QRect geom;
+ for (int i = 0; i < screens()->count(); i++) {
+ geom |= screens()->geometry(i);
+ }
+ NETSize desktop_geometry;
+ desktop_geometry.width = geom.width();
+ desktop_geometry.height = geom.height();
+ rootInfo->setDesktopGeometry(desktop_geometry);
+ setShowingDesktop(false);
+
+ } // End updates blocker block
+
+ // TODO: only on X11?
+ AbstractClient* new_active_client = nullptr;
+ if (!qApp->isSessionRestored()) {
+ --block_focus;
+ new_active_client = findClient(Predicate::WindowMatch, \
client_info.activeWindow()); + }
+ if (new_active_client == NULL
+ && activeClient() == NULL && should_get_focus.count() == 0) {
+ // No client activated in manage()
+ if (new_active_client == NULL)
+ new_active_client = \
topClientOnDesktop(VirtualDesktopManager::self()->current(), -1); + if \
(new_active_client == NULL && !desktops.isEmpty()) + new_active_client = \
findDesktop(true, VirtualDesktopManager::self()->current()); + }
+ if (new_active_client != NULL)
+ activateClient(new_active_client);
+}
+
Workspace::~Workspace()
{
blockStackingUpdates(true);
@@ -1207,7 +1229,9 @@ bool Workspace::checkStartupNotification(xcb_window_t w, \
KStartupInfoId &id, KSt
*/
void Workspace::focusToNull()
{
- m_nullFocus->focus();
+ if (m_nullFocus) {
+ m_nullFocus->focus();
+ }
}
void Workspace::setShowingDesktop(bool showing)
diff --git a/workspace.h b/workspace.h
index e70cf7daf..012210d95 100644
--- a/workspace.h
+++ b/workspace.h
@@ -494,6 +494,7 @@ Q_SIGNALS:
private:
void init();
+ void initWithX11();
void initShortcuts();
template <typename Slot>
void initShortcut(const QString &actionName, const QString &description, const \
QKeySequence &shortcut,
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic