<table><tr><td style="">kmaterka added a comment.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D26395">View Revision</a></tr></table><br /><div><div><p>This is another approach to fix <a href="https://bugs.kde.org/show_bug.cgi?id=357443" class="remarkup-link" target="_blank" rel="noreferrer">357443</a>. It is still a workaround, but more reliable and uses better concept.</p></div></div><br /><div><strong>INLINE COMMENTS</strong><div><div style="margin: 6px 0 12px 0;"><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D26395#inline-148586">View Inline</a><span style="color: #4b4d51; font-weight: bold;">fdoselectionmanager.cpp:167</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span style="color: #74777d">// workaround for BUG 357443: when KWin is restarted, container window is shown on top</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">event</span><span style="color: #aa2211">-></span><span class="n">state</span> <span style="color: #aa2211">==</span> <span class="n">XCB_VISIBILITY_UNOBSCURED</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">            <span style="color: #aa4000">for</span> <span class="p">(</span><span style="color: #aa4000">auto</span> <span style="color: #a0a000">sniProxy</span> <span class="p">:</span> <span class="n">m_proxies</span><span class="p">.</span><span class="n">values</span><span class="p">())</span> <span class="p">{</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">XCB_VISIBILITY_UNOBSCURED is rare. During simulated click (when we stack window above) xembedsniproxy receives XCB_VISIBILITY_PARTIALLY_OBSCURED. Obviously we ignore the last possible case: XCB_VISIBILITY_FULLY_OBSCURED.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D26395#inline-148585">View Inline</a><span style="color: #4b4d51; font-weight: bold;">fdoselectionmanager.cpp:168</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">event</span><span style="color: #aa2211">-></span><span class="n">state</span> <span style="color: #aa2211">==</span> <span class="n">XCB_VISIBILITY_UNOBSCURED</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">            <span style="color: #aa4000">for</span> <span class="p">(</span><span style="color: #aa4000">auto</span> <span style="color: #a0a000">sniProxy</span> <span class="p">:</span> <span class="n">m_proxies</span><span class="p">.</span><span class="n">values</span><span class="p">())</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">                <span class="n">sniProxy</span><span style="color: #aa2211">-></span><span class="n">hideContainerWindow</span><span class="p">(</span><span class="n">event</span><span style="color: #aa2211">-></span><span class="n">window</span><span class="p">);</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Iteration sucks, but this is the simplest (a in most cases the quickest) method. In this event we receive container window id, we can get its child and get sniproxy using it:</p>

<div class="remarkup-code-block" style="margin: 12px 0;" data-code-lang="text" data-sigil="remarkup-code-block"><pre class="remarkup-code" style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; padding: 12px; margin: 0; background: rgba(71, 87, 120, 0.08);">xcb_connection_t *c = QX11Info::connection();
xcb_query_tree_cookie_t cookie = xcb_query_tree(c, event->window);
QScopedPointer<xcb_query_tree_reply_t, QScopedPointerPodDeleter>
    reply(xcb_query_tree_reply(c, cookie, nullptr));

if (reply && xcb_query_tree_children_length(reply.data()) == 1) {
    xcb_window_t *children = xcb_query_tree_children(reply.data());
    const auto sniProxy = m_proxies.value(children[0]);
    if (sniProxy) {
        sniProxy->handleExposeEvent(event->window);
    }
}</pre></div>

<p style="padding: 0; margin: 8px;">IMO this is slower.</p>

<p style="padding: 0; margin: 8px;">The best would be to have second map like m_proxies, but with container windows id (or something similar in the idea).</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D26395#inline-148584">View Inline</a><span style="color: #4b4d51; font-weight: bold;">sniproxy.cpp:527</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; ">    <span class="n">qCDebug</span><span class="p">(</span><span class="n">SNIPROXY</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span style="color: #766510">"Received click"</span> <span style="color: #aa2211"><<</span> <span class="n">mouseButton</span> <span style="color: #aa2211"><<</span> <span style="color: #766510">"with passed x*y"</span> <span style="color: #aa2211"><<</span> <span class="n">x</span> <span style="color: #aa2211"><<</span> <span class="n">y</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span class="n">sendingClickEvent</span> <span style="color: #aa2211">=</span> <span style="color: #304a96">true</span><span class="p">;</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">During click, container window is showed for a brief moment (STACK_ABOVE), so it is possible that it will sent visibility event. This is probably not needed, I tested it and all events generated in this method (stack above, click, stack below) were processed before visibility event is received in XEmbedSNIProxy. I added this just in case - I'm not sure how X events are queued and how reliable the order is.</p></div></div></div></div></div><br /><div><strong>REPOSITORY</strong><div><div>R120 Plasma Workspace</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D26395">https://phabricator.kde.org/D26395</a></div></div><br /><div><strong>To: </strong>kmaterka, Plasma: Workspaces, Plasma, davidedmundson<br /><strong>Cc: </strong>plasma-devel, LeGast00n, The-Feren-OS-Dev, jraleigh, zachus, fbampaloukas, GB_2, ragreen, ZrenBot, ngraham, alexeymin, himcesjf, lesliezhai, ali-mohamed, jensreuterberg, abetts, sebas, apol, ahiemstra, mart<br /></div>