Changeset View
Changeset View
Standalone View
Standalone View
wayland_server.cpp
Show All 17 Lines | |||||
18 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | *********************************************************************/ | 19 | *********************************************************************/ | ||
20 | #include "wayland_server.h" | 20 | #include "wayland_server.h" | ||
21 | #include "x11client.h" | 21 | #include "x11client.h" | ||
22 | #include "platform.h" | 22 | #include "platform.h" | ||
23 | #include "composite.h" | 23 | #include "composite.h" | ||
24 | #include "idle_inhibition.h" | 24 | #include "idle_inhibition.h" | ||
25 | #include "screens.h" | 25 | #include "screens.h" | ||
26 | #include "xdgshellclient.h" | | |||
27 | #include "workspace.h" | 26 | #include "workspace.h" | ||
27 | #include "xdgshellclient.h" | ||||
28 | 28 | | |||
29 | // Client | 29 | // Client | ||
30 | #include <KWayland/Client/connection_thread.h> | 30 | #include <KWayland/Client/connection_thread.h> | ||
31 | #include <KWayland/Client/event_queue.h> | 31 | #include <KWayland/Client/event_queue.h> | ||
32 | #include <KWayland/Client/registry.h> | 32 | #include <KWayland/Client/registry.h> | ||
33 | #include <KWayland/Client/compositor.h> | 33 | #include <KWayland/Client/compositor.h> | ||
34 | #include <KWayland/Client/seat.h> | 34 | #include <KWayland/Client/seat.h> | ||
35 | #include <KWayland/Client/datadevicemanager.h> | 35 | #include <KWayland/Client/datadevicemanager.h> | ||
Show All 18 Lines | |||||
54 | #include <KWaylandServer/seat_interface.h> | 54 | #include <KWaylandServer/seat_interface.h> | ||
55 | #include <KWaylandServer/server_decoration_interface.h> | 55 | #include <KWaylandServer/server_decoration_interface.h> | ||
56 | #include <KWaylandServer/server_decoration_palette_interface.h> | 56 | #include <KWaylandServer/server_decoration_palette_interface.h> | ||
57 | #include <KWaylandServer/shadow_interface.h> | 57 | #include <KWaylandServer/shadow_interface.h> | ||
58 | #include <KWaylandServer/subcompositor_interface.h> | 58 | #include <KWaylandServer/subcompositor_interface.h> | ||
59 | #include <KWaylandServer/blur_interface.h> | 59 | #include <KWaylandServer/blur_interface.h> | ||
60 | #include <KWaylandServer/outputmanagement_interface.h> | 60 | #include <KWaylandServer/outputmanagement_interface.h> | ||
61 | #include <KWaylandServer/outputconfiguration_interface.h> | 61 | #include <KWaylandServer/outputconfiguration_interface.h> | ||
62 | #include <KWaylandServer/xdgdecoration_interface.h> | 62 | #include <KWaylandServer/xdgdecoration_v1_interface.h> | ||
63 | #include <KWaylandServer/xdgshell_interface.h> | 63 | #include <KWaylandServer/xdgshell_interface.h> | ||
64 | #include <KWaylandServer/xdgforeign_interface.h> | 64 | #include <KWaylandServer/xdgforeign_interface.h> | ||
65 | #include <KWaylandServer/xdgoutput_interface.h> | 65 | #include <KWaylandServer/xdgoutput_interface.h> | ||
66 | #include <KWaylandServer/keystate_interface.h> | 66 | #include <KWaylandServer/keystate_interface.h> | ||
67 | #include <KWaylandServer/filtered_display.h> | 67 | #include <KWaylandServer/filtered_display.h> | ||
68 | 68 | | |||
69 | // KF | 69 | // KF | ||
70 | #include <KServiceTypeTrader> | 70 | #include <KServiceTypeTrader> | ||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Line(s) | 135 | { | |||
138 | if (m_display) { | 138 | if (m_display) { | ||
139 | const auto connections = m_display->connections(); | 139 | const auto connections = m_display->connections(); | ||
140 | for (auto it = connections.begin(); it != connections.end(); ++it) { | 140 | for (auto it = connections.begin(); it != connections.end(); ++it) { | ||
141 | (*it)->destroy(); | 141 | (*it)->destroy(); | ||
142 | } | 142 | } | ||
143 | } | 143 | } | ||
144 | } | 144 | } | ||
145 | 145 | | |||
146 | template <class T> | 146 | void WaylandServer::registerClient(AbstractClient *client) | ||
147 | void WaylandServer::createSurface(T *surface) | | |||
148 | { | 147 | { | ||
149 | if (!Workspace::self()) { | 148 | if (client->readyForPainting()) { | ||
150 | // it's possible that a Surface gets created before Workspace is created | 149 | emit shellClientAdded(client); | ||
150 | } else { | ||||
151 | connect(client, &AbstractClient::windowShown, this, &WaylandServer::shellClientShown); | ||||
152 | } | ||||
153 | m_clients << client; | ||||
154 | } | ||||
155 | | ||||
156 | void WaylandServer::createXdgToplevelClient(XdgToplevelInterface *shellSurface) | ||||
157 | { | ||||
158 | if (!workspace()) { | ||||
151 | return; | 159 | return; | ||
davidedmundson: This can never be true.
It's a protocol error on XDGShell to map before configure | |||||
Well, yeah. I just wanted to keep things as generic as possible. Will remove it. zzag: Well, yeah. I just wanted to keep things as generic as possible. Will remove it. | |||||
Hmm, apol has a patch series that implements zwp_input_panel_surface_v1. Unfortunately, the input method spec allows clients to create input panel surfaces with already attached buffers. Given that we'll need this code path later, I suggest to keep it so we don't have to re-introduce it again. zzag: Hmm, apol has a patch series that implements zwp_input_panel_surface_v1. Unfortunately, the… | |||||
152 | } | 160 | } | ||
161 | | ||||
162 | SurfaceInterface *surface = shellSurface->surface(); | ||||
153 | if (surface->client() == m_xwayland.client) { | 163 | if (surface->client() == m_xwayland.client) { | ||
154 | // skip Xwayland clients, those are created using standard X11 way | | |||
155 | return; | 164 | return; | ||
156 | } | 165 | } | ||
157 | if (surface->client() == m_screenLockerClientConnection) { | 166 | if (surface->client() == m_screenLockerClientConnection) { | ||
158 | ScreenLocker::KSldApp::self()->lockScreenShown(); | 167 | ScreenLocker::KSldApp::self()->lockScreenShown(); | ||
159 | } | 168 | } | ||
160 | XdgShellClient *client = new XdgShellClient(surface); | 169 | | ||
161 | if (ServerSideDecorationInterface *deco = ServerSideDecorationInterface::get(surface->surface())) { | 170 | XdgToplevelClient *client = new XdgToplevelClient(shellSurface); | ||
162 | client->installServerSideDecoration(deco); | 171 | registerClient(client); | ||
163 | } | 172 | | ||
164 | auto it = std::find_if(m_plasmaShellSurfaces.begin(), m_plasmaShellSurfaces.end(), | 173 | auto it = std::find_if(m_plasmaShellSurfaces.begin(), m_plasmaShellSurfaces.end(), | ||
165 | [client] (PlasmaShellSurfaceInterface *surface) { | 174 | [surface] (PlasmaShellSurfaceInterface *plasmaSurface) { | ||
166 | return client->surface() == surface->surface(); | 175 | return plasmaSurface->surface() == surface; | ||
167 | } | 176 | } | ||
168 | ); | 177 | ); | ||
169 | if (it != m_plasmaShellSurfaces.end()) { | 178 | if (it != m_plasmaShellSurfaces.end()) { | ||
170 | client->installPlasmaShellSurface(*it); | 179 | client->installPlasmaShellSurface(*it); | ||
171 | m_plasmaShellSurfaces.erase(it); | 180 | m_plasmaShellSurfaces.erase(it); | ||
172 | } | 181 | } | ||
173 | if (auto menu = m_appMenuManager->appMenuForSurface(surface->surface())) { | 182 | if (auto decoration = ServerSideDecorationInterface::get(surface)) { | ||
183 | client->installServerDecoration(decoration); | ||||
184 | } | ||||
185 | if (auto menu = m_appMenuManager->appMenuForSurface(surface)) { | ||||
174 | client->installAppMenu(menu); | 186 | client->installAppMenu(menu); | ||
175 | } | 187 | } | ||
176 | if (auto palette = m_paletteManager->paletteForSurface(surface->surface())) { | 188 | if (auto palette = m_paletteManager->paletteForSurface(surface)) { | ||
177 | client->installPalette(palette); | 189 | client->installPalette(palette); | ||
178 | } | 190 | } | ||
179 | m_clients << client; | | |||
180 | if (client->readyForPainting()) { | | |||
181 | emit shellClientAdded(client); | | |||
182 | } else { | | |||
183 | connect(client, &XdgShellClient::windowShown, this, &WaylandServer::shellClientShown); | | |||
184 | } | | |||
185 | 191 | | |||
186 | //not directly connected as the connection is tied to client instead of this | 192 | connect(m_XdgForeign, &XdgForeignInterface::transientChanged, client, [this](SurfaceInterface *child) { | ||
187 | connect(m_XdgForeign, &KWaylandServer::XdgForeignInterface::transientChanged, client, [this](KWaylandServer::SurfaceInterface *child) { | | |||
188 | emit foreignTransientChanged(child); | 193 | emit foreignTransientChanged(child); | ||
189 | }); | 194 | }); | ||
190 | } | 195 | } | ||
191 | 196 | | |||
197 | void WaylandServer::createXdgPopupClient(XdgPopupInterface *shellSurface) | ||||
198 | { | ||||
199 | if (!workspace()) { | ||||
200 | return; | ||||
201 | } | ||||
202 | | ||||
203 | XdgPopupClient *client = new XdgPopupClient(shellSurface); | ||||
204 | registerClient(client); | ||||
205 | } | ||||
206 | | ||||
192 | class KWinDisplay : public KWaylandServer::FilteredDisplay | 207 | class KWinDisplay : public KWaylandServer::FilteredDisplay | ||
193 | { | 208 | { | ||
194 | public: | 209 | public: | ||
195 | KWinDisplay(QObject *parent) | 210 | KWinDisplay(QObject *parent) | ||
196 | : KWaylandServer::FilteredDisplay(parent) | 211 | : KWaylandServer::FilteredDisplay(parent) | ||
197 | {} | 212 | {} | ||
198 | 213 | | |||
199 | static QByteArray sha256(const QString &fileName) | 214 | static QByteArray sha256(const QString &fileName) | ||
▲ Show 20 Lines • Show All 111 Lines • ▼ Show 20 Line(s) | 312 | [this] (SurfaceInterface *surface) { | |||
311 | if (Toplevel *t = ws->findToplevel(check)) { | 326 | if (Toplevel *t = ws->findToplevel(check)) { | ||
312 | t->setSurface(surface); | 327 | t->setSurface(surface); | ||
313 | } | 328 | } | ||
314 | } | 329 | } | ||
315 | ); | 330 | ); | ||
316 | 331 | | |||
317 | m_tabletManager = m_display->createTabletManagerInterface(m_display); | 332 | m_tabletManager = m_display->createTabletManagerInterface(m_display); | ||
318 | 333 | | |||
319 | m_xdgShell = m_display->createXdgShell(XdgShellInterfaceVersion::Stable, m_display); | 334 | m_xdgShell = m_display->createXdgShell(m_display); | ||
320 | m_xdgShell->create(); | 335 | connect(m_xdgShell, &XdgShellInterface::toplevelCreated, this, &WaylandServer::createXdgToplevelClient); | ||
321 | connect(m_xdgShell, &XdgShellInterface::surfaceCreated, this, &WaylandServer::createSurface<XdgShellSurfaceInterface>); | 336 | connect(m_xdgShell, &XdgShellInterface::popupCreated, this, &WaylandServer::createXdgPopupClient); | ||
322 | connect(m_xdgShell, &XdgShellInterface::xdgPopupCreated, this, &WaylandServer::createSurface<XdgShellPopupInterface>); | 337 | | ||
323 | 338 | m_xdgDecorationManagerV1 = m_display->createXdgDecorationManagerV1(m_display); | |||
324 | m_xdgDecorationManager = m_display->createXdgDecorationManager(m_xdgShell, m_display); | 339 | connect(m_xdgDecorationManagerV1, &XdgDecorationManagerV1Interface::decorationCreated, this, | ||
325 | m_xdgDecorationManager->create(); | 340 | [this](XdgToplevelDecorationV1Interface *decoration) { | ||
326 | connect(m_xdgDecorationManager, &XdgDecorationManagerInterface::xdgDecorationInterfaceCreated, this, [this] (XdgDecorationInterface *deco) { | 341 | if (XdgToplevelClient *toplevel = findXdgToplevelClient(decoration->toplevel()->surface())) { | ||
327 | if (XdgShellClient *client = findXdgShellClient(deco->surface()->surface())) { | 342 | toplevel->installXdgDecoration(decoration); | ||
328 | client->installXdgDecoration(deco); | | |||
329 | } | 343 | } | ||
330 | }); | 344 | } | ||
345 | ); | ||||
331 | 346 | | |||
332 | m_display->createShm(); | 347 | m_display->createShm(); | ||
333 | m_seat = m_display->createSeat(m_display); | 348 | m_seat = m_display->createSeat(m_display); | ||
334 | m_seat->create(); | 349 | m_seat->create(); | ||
335 | m_display->createPointerGestures(PointerGesturesInterfaceVersion::UnstableV1, m_display)->create(); | 350 | m_display->createPointerGestures(PointerGesturesInterfaceVersion::UnstableV1, m_display)->create(); | ||
336 | m_display->createPointerConstraints(PointerConstraintsInterfaceVersion::UnstableV1, m_display)->create(); | 351 | m_display->createPointerConstraints(PointerConstraintsInterfaceVersion::UnstableV1, m_display)->create(); | ||
337 | m_dataDeviceManager = m_display->createDataDeviceManager(m_display); | 352 | m_dataDeviceManager = m_display->createDataDeviceManager(m_display); | ||
338 | m_dataDeviceManager->create(); | 353 | m_dataDeviceManager->create(); | ||
339 | m_idle = m_display->createIdle(m_display); | 354 | m_idle = m_display->createIdle(m_display); | ||
340 | m_idle->create(); | 355 | m_idle->create(); | ||
341 | auto idleInhibition = new IdleInhibition(m_idle); | 356 | auto idleInhibition = new IdleInhibition(m_idle); | ||
342 | connect(this, &WaylandServer::shellClientAdded, idleInhibition, &IdleInhibition::registerClient); | 357 | connect(this, &WaylandServer::shellClientAdded, idleInhibition, &IdleInhibition::registerClient); | ||
343 | m_display->createIdleInhibitManager(IdleInhibitManagerInterfaceVersion::UnstableV1, m_display)->create(); | 358 | m_display->createIdleInhibitManager(IdleInhibitManagerInterfaceVersion::UnstableV1, m_display)->create(); | ||
344 | m_plasmaShell = m_display->createPlasmaShell(m_display); | 359 | m_plasmaShell = m_display->createPlasmaShell(m_display); | ||
345 | m_plasmaShell->create(); | 360 | m_plasmaShell->create(); | ||
346 | connect(m_plasmaShell, &PlasmaShellInterface::surfaceCreated, | 361 | connect(m_plasmaShell, &PlasmaShellInterface::surfaceCreated, | ||
347 | [this] (PlasmaShellSurfaceInterface *surface) { | 362 | [this] (PlasmaShellSurfaceInterface *surface) { | ||
348 | if (XdgShellClient *client = findXdgShellClient(surface->surface())) { | 363 | if (XdgToplevelClient *client = findXdgToplevelClient(surface->surface())) { | ||
349 | client->installPlasmaShellSurface(surface); | 364 | client->installPlasmaShellSurface(surface); | ||
350 | } else { | 365 | return; | ||
351 | m_plasmaShellSurfaces << surface; | | |||
352 | connect(surface, &QObject::destroyed, this, | | |||
353 | [this, surface] { | | |||
354 | m_plasmaShellSurfaces.removeOne(surface); | | |||
355 | } | | |||
356 | ); | | |||
357 | } | 366 | } | ||
367 | m_plasmaShellSurfaces.append(surface); | ||||
368 | connect(surface, &QObject::destroyed, this, [this, surface] { | ||||
369 | m_plasmaShellSurfaces.removeOne(surface); | ||||
370 | }); | ||||
358 | } | 371 | } | ||
359 | ); | 372 | ); | ||
360 | m_appMenuManager = m_display->createAppMenuManagerInterface(m_display); | 373 | m_appMenuManager = m_display->createAppMenuManagerInterface(m_display); | ||
361 | m_appMenuManager->create(); | 374 | m_appMenuManager->create(); | ||
362 | connect(m_appMenuManager, &AppMenuManagerInterface::appMenuCreated, | 375 | connect(m_appMenuManager, &AppMenuManagerInterface::appMenuCreated, | ||
363 | [this] (AppMenuInterface *appMenu) { | 376 | [this] (AppMenuInterface *appMenu) { | ||
364 | if (XdgShellClient *client = findXdgShellClient(appMenu->surface())) { | 377 | if (XdgToplevelClient *client = findXdgToplevelClient(appMenu->surface())) { | ||
365 | client->installAppMenu(appMenu); | 378 | client->installAppMenu(appMenu); | ||
366 | } | 379 | } | ||
367 | } | 380 | } | ||
368 | ); | 381 | ); | ||
369 | m_paletteManager = m_display->createServerSideDecorationPaletteManager(m_display); | 382 | m_paletteManager = m_display->createServerSideDecorationPaletteManager(m_display); | ||
370 | m_paletteManager->create(); | 383 | m_paletteManager->create(); | ||
371 | connect(m_paletteManager, &ServerSideDecorationPaletteManagerInterface::paletteCreated, | 384 | connect(m_paletteManager, &ServerSideDecorationPaletteManagerInterface::paletteCreated, | ||
372 | [this] (ServerSideDecorationPaletteInterface *palette) { | 385 | [this] (ServerSideDecorationPaletteInterface *palette) { | ||
373 | if (XdgShellClient *client = findXdgShellClient(palette->surface())) { | 386 | if (XdgToplevelClient *client = findXdgToplevelClient(palette->surface())) { | ||
374 | client->installPalette(palette); | 387 | client->installPalette(palette); | ||
375 | } | 388 | } | ||
376 | } | 389 | } | ||
377 | ); | 390 | ); | ||
378 | 391 | | |||
379 | m_windowManagement = m_display->createPlasmaWindowManagement(m_display); | 392 | m_windowManagement = m_display->createPlasmaWindowManagement(m_display); | ||
380 | m_windowManagement->create(); | 393 | m_windowManagement->create(); | ||
381 | m_windowManagement->setShowingDesktopState(PlasmaWindowManagementInterface::ShowingDesktopState::Disabled); | 394 | m_windowManagement->setShowingDesktopState(PlasmaWindowManagementInterface::ShowingDesktopState::Disabled); | ||
Show All 27 Lines | |||||
409 | 422 | | |||
410 | auto shadowManager = m_display->createShadowManager(m_display); | 423 | auto shadowManager = m_display->createShadowManager(m_display); | ||
411 | shadowManager->create(); | 424 | shadowManager->create(); | ||
412 | 425 | | |||
413 | m_display->createDpmsManager(m_display)->create(); | 426 | m_display->createDpmsManager(m_display)->create(); | ||
414 | 427 | | |||
415 | m_decorationManager = m_display->createServerSideDecorationManager(m_display); | 428 | m_decorationManager = m_display->createServerSideDecorationManager(m_display); | ||
416 | connect(m_decorationManager, &ServerSideDecorationManagerInterface::decorationCreated, this, | 429 | connect(m_decorationManager, &ServerSideDecorationManagerInterface::decorationCreated, this, | ||
417 | [this] (ServerSideDecorationInterface *deco) { | 430 | [this] (ServerSideDecorationInterface *decoration) { | ||
418 | if (XdgShellClient *c = findXdgShellClient(deco->surface())) { | 431 | if (XdgToplevelClient *client = findXdgToplevelClient(decoration->surface())) { | ||
419 | c->installServerSideDecoration(deco); | 432 | client->installServerDecoration(decoration); | ||
420 | } | 433 | } | ||
421 | connect(deco, &ServerSideDecorationInterface::modeRequested, this, | 434 | connect(decoration, &ServerSideDecorationInterface::modeRequested, this, | ||
422 | [deco] (ServerSideDecorationManagerInterface::Mode mode) { | 435 | [decoration] (ServerSideDecorationManagerInterface::Mode mode) { | ||
423 | // always acknowledge the requested mode | 436 | // always acknowledge the requested mode | ||
424 | deco->setMode(mode); | 437 | decoration->setMode(mode); | ||
425 | } | 438 | } | ||
426 | ); | 439 | ); | ||
427 | } | 440 | } | ||
428 | ); | 441 | ); | ||
429 | m_decorationManager->create(); | 442 | m_decorationManager->create(); | ||
430 | 443 | | |||
431 | m_outputManagement = m_display->createOutputManagement(m_display); | 444 | m_outputManagement = m_display->createOutputManagement(m_display); | ||
432 | connect(m_outputManagement, &OutputManagementInterface::configurationChangeRequested, | 445 | connect(m_outputManagement, &OutputManagementInterface::configurationChangeRequested, | ||
Show All 25 Lines | 466 | { | |||
458 | return m_linuxDmabuf; | 471 | return m_linuxDmabuf; | ||
459 | } | 472 | } | ||
460 | 473 | | |||
461 | SurfaceInterface *WaylandServer::findForeignTransientForSurface(SurfaceInterface *surface) | 474 | SurfaceInterface *WaylandServer::findForeignTransientForSurface(SurfaceInterface *surface) | ||
462 | { | 475 | { | ||
463 | return m_XdgForeign->transientFor(surface); | 476 | return m_XdgForeign->transientFor(surface); | ||
464 | } | 477 | } | ||
465 | 478 | | |||
466 | void WaylandServer::shellClientShown(Toplevel *t) | 479 | void WaylandServer::shellClientShown(Toplevel *toplevel) | ||
467 | { | 480 | { | ||
468 | XdgShellClient *c = dynamic_cast<XdgShellClient *>(t); | 481 | AbstractClient *client = qobject_cast<AbstractClient *>(toplevel); | ||
469 | if (!c) { | 482 | if (!client) { | ||
470 | qCWarning(KWIN_CORE) << "Failed to cast a Toplevel which is supposed to be a XdgShellClient to XdgShellClient"; | 483 | qCWarning(KWIN_CORE) << "Failed to cast a Toplevel which is supposed to be an AbstractClient to AbstractClient"; | ||
471 | return; | 484 | return; | ||
472 | } | 485 | } | ||
473 | disconnect(c, &XdgShellClient::windowShown, this, &WaylandServer::shellClientShown); | 486 | disconnect(client, &AbstractClient::windowShown, this, &WaylandServer::shellClientShown); | ||
474 | emit shellClientAdded(c); | 487 | emit shellClientAdded(client); | ||
475 | } | 488 | } | ||
476 | 489 | | |||
477 | void WaylandServer::initWorkspace() | 490 | void WaylandServer::initWorkspace() | ||
478 | { | 491 | { | ||
479 | VirtualDesktopManager::self()->setVirtualDesktopManagement(m_virtualDesktopManagement); | 492 | VirtualDesktopManager::self()->setVirtualDesktopManagement(m_virtualDesktopManagement); | ||
480 | 493 | | |||
481 | if (m_windowManagement) { | 494 | if (m_windowManagement) { | ||
482 | connect(workspace(), &Workspace::showingDesktopChanged, this, | 495 | connect(workspace(), &Workspace::showingDesktopChanged, this, | ||
▲ Show 20 Lines • Show All 261 Lines • ▼ Show 20 Line(s) | 756 | if (!surface) { | |||
744 | return nullptr; | 757 | return nullptr; | ||
745 | } | 758 | } | ||
746 | if (AbstractClient *c = findClientInList(m_clients, surface)) { | 759 | if (AbstractClient *c = findClientInList(m_clients, surface)) { | ||
747 | return c; | 760 | return c; | ||
748 | } | 761 | } | ||
749 | return nullptr; | 762 | return nullptr; | ||
750 | } | 763 | } | ||
751 | 764 | | |||
752 | XdgShellClient *WaylandServer::findXdgShellClient(SurfaceInterface *surface) const | 765 | XdgToplevelClient *WaylandServer::findXdgToplevelClient(SurfaceInterface *surface) const | ||
753 | { | 766 | { | ||
754 | return qobject_cast<XdgShellClient *>(findClient(surface)); | 767 | return qobject_cast<XdgToplevelClient *>(findClient(surface)); | ||
755 | } | 768 | } | ||
756 | 769 | | |||
757 | quint32 WaylandServer::createWindowId(SurfaceInterface *surface) | 770 | quint32 WaylandServer::createWindowId(SurfaceInterface *surface) | ||
758 | { | 771 | { | ||
759 | auto it = m_clientIds.constFind(surface->client()); | 772 | auto it = m_clientIds.constFind(surface->client()); | ||
760 | quint16 clientId = 0; | 773 | quint16 clientId = 0; | ||
761 | if (it != m_clientIds.constEnd()) { | 774 | if (it != m_clientIds.constEnd()) { | ||
762 | clientId = it.value(); | 775 | clientId = it.value(); | ||
▲ Show 20 Lines • Show All 73 Lines • Show Last 20 Lines |
This can never be true.
It's a protocol error on XDGShell to map before configure