bool KWindowSystemPrivate::x11Event( XEvent * ev ) { KWindowSystem* s_q = KWindowSystem::self(); #ifdef HAVE_XFIXES if ( ev->type == xfixesEventBase + XFixesSelectionNotify && ev->xany.window == winId() ) { XFixesSelectionNotifyEvent *event = reinterpret_cast<XFixesSelectionNotifyEvent*>(ev); bool haveOwner = event->owner != None; if (compositingEnabled != haveOwner) { compositingEnabled = haveOwner; emit s_q->compositingChanged( compositingEnabled ); } return true; } #endif if ( ev->xany.window == QX11Info::appRootWindow() ) { int old_current_desktop = currentDesktop(); WId old_active_window = activeWindow(); int old_number_of_desktops = numberOfDesktops(); bool old_showing_desktop = showingDesktop(); unsigned long m[ 5 ]; NETRootInfo::event( ev, m, 5 ); if (( m[ PROTOCOLS ] & CurrentDesktop ) && currentDesktop() != old_current_desktop ) emit s_q->currentDesktopChanged( currentDesktop() ); if (( m[ PROTOCOLS ] & DesktopViewport ) && mapViewport() && currentDesktop() != old_current_desktop ) emit s_q->currentDesktopChanged( currentDesktop() ); if (( m[ PROTOCOLS ] & ActiveWindow ) && activeWindow() != old_active_window ) emit s_q->activeWindowChanged( activeWindow() ); if ( m[ PROTOCOLS ] & DesktopNames ) emit s_q->desktopNamesChanged(); if (( m[ PROTOCOLS ] & NumberOfDesktops ) && numberOfDesktops() != old_number_of_desktops ) emit s_q->numberOfDesktopsChanged( numberOfDesktops() ); if (( m[ PROTOCOLS ] & DesktopGeometry ) && mapViewport() && numberOfDesktops() != old_number_of_desktops ) emit s_q->numberOfDesktopsChanged( numberOfDesktops() ); if ( m[ PROTOCOLS ] & WorkArea ) emit s_q->workAreaChanged(); if ( m[ PROTOCOLS ] & ClientListStacking ) { updateStackingOrder(); emit s_q->stackingOrderChanged(); } if(( m[ PROTOCOLS2 ] & WM2ShowingDesktop ) && showingDesktop() != old_showing_desktop ) { emit s_q->showingDesktopChanged( showingDesktop()); } } else if ( windows.contains( ev->xany.window ) ){ NETWinInfo ni( QX11Info::display(), ev->xany.window, QX11Info::appRootWindow(), 0 ); unsigned long dirty[ 2 ]; ni.event( ev, dirty, 2 ); if ( ev->type ==PropertyNotify ) { if( ev->xproperty.atom == XA_WM_HINTS ) dirty[ NETWinInfo::PROTOCOLS ] |= NET::WMIcon; // support for old icons else if( ev->xproperty.atom == XA_WM_NAME ) dirty[ NETWinInfo::PROTOCOLS ] |= NET::WMName; // support for old name else if( ev->xproperty.atom == XA_WM_ICON_NAME ) dirty[ NETWinInfo::PROTOCOLS ] |= NET::WMIconName; // support for old iconic name } if( mapViewport() && ( dirty[ NETWinInfo::PROTOCOLS ] & (NET::WMState | NET::WMGeometry) )) { /* geometry change -> possible viewport change * state change -> possible NET::Sticky change */ dirty[ NETWinInfo::PROTOCOLS ] |= NET::WMDesktop; } if ( (dirty[ NETWinInfo::PROTOCOLS ] & NET::WMStrut) != 0 ) { removeStrutWindow( ev->xany.window ); if ( !possibleStrutWindows.contains( ev->xany.window ) ) possibleStrutWindows.append( ev->xany.window ); } if ( dirty[ NETWinInfo::PROTOCOLS ] || dirty[ NETWinInfo::PROTOCOLS2 ] ) { emit s_q->windowChanged( ev->xany.window ); emit s_q->windowChanged( ev->xany.window, dirty ); emit s_q->windowChanged( ev->xany.window, dirty[ NETWinInfo::PROTOCOLS ] ); if ( (dirty[ NETWinInfo::PROTOCOLS ] & NET::WMStrut) != 0 ) emit s_q->strutChanged(); } } return false; }
void Workspace::setShouldGetFocus( Client* c ) { should_get_focus.append( c ); updateStackingOrder(); // e.g. fullscreens have different layer when active/not-active }
// not virtual, but it's called directly only from init() void KWindowSystemPrivate::activate() { NETRootInfo::activate(); updateStackingOrder(); }