diff --git a/ksmserver/server.cpp b/ksmserver/server.cpp index f4068a8f3..ce118a529 100644 --- a/ksmserver/server.cpp +++ b/ksmserver/server.cpp @@ -579,7 +579,7 @@ extern "C" int _IceTransNoListen(const char * protocol); #endif KSMServer::KSMServer( const TQString& windowManager, bool _only_local ) - : DCOPObject("ksmserver"), sessionGroup( "" ) + : DCOPObject("ksmserver"), sessionGroup( "" ), shutdownNotifierIPDlg(0) { the_server = this; clean = false; diff --git a/ksmserver/server.h b/ksmserver/server.h index 0fc900042..1fd55a217 100644 --- a/ksmserver/server.h +++ b/ksmserver/server.h @@ -174,6 +174,8 @@ private: void saveCurrentSession(); void saveCurrentSessionAs( TQString ); + TQWidget* shutdownNotifierIPDlg; + private: TQPtrList listener; TQPtrList clients; diff --git a/ksmserver/shutdown.cpp b/ksmserver/shutdown.cpp index 549fd2cc3..a153b2806 100644 --- a/ksmserver/shutdown.cpp +++ b/ksmserver/shutdown.cpp @@ -188,7 +188,7 @@ void KSMServer::shutdownInternal( KApplication::ShutdownConfirm confirm, if (showFancyLogout) { KSMShutdownIPFeedback::showit(); // hide the UGLY logout process from the user - KSMShutdownIPDlg::showShutdownIP(); + shutdownNotifierIPDlg = KSMShutdownIPDlg::showShutdownIP(); } if ( saveSession ) @@ -553,6 +553,10 @@ void KSMServer::killWM() { state = KillingWM; bool iswm = false; + if (shutdownNotifierIPDlg) { + shutdownNotifierIPDlg->close(); + shutdownNotifierIPDlg=0; + } for ( KSMClient* c = clients.first(); c; c = clients.next() ) { if( isWM( c )) { iswm = true; diff --git a/ksmserver/shutdowndlg.cpp b/ksmserver/shutdowndlg.cpp index 3deffdb71..c49e31974 100644 --- a/ksmserver/shutdowndlg.cpp +++ b/ksmserver/shutdowndlg.cpp @@ -516,10 +516,11 @@ void KSMShutdownFeedback::slotPaintEffect() KSMShutdownIPFeedback * KSMShutdownIPFeedback::s_pSelf = 0L; KSMShutdownIPFeedback::KSMShutdownIPFeedback() - : TQWidget( 0L, "feedbackipwidget", Qt::WType_Dialog | Qt::WStyle_StaysOnTop | Qt::WX11BypassWM ), m_timeout(0) + : TQWidget( 0L, "feedbackipwidget", Qt::WType_Dialog | Qt::WStyle_StaysOnTop ), m_timeout(0) { setShown(false); + setWindowState(WindowFullScreen); // Try to get the root pixmap system("krootbacking &"); @@ -1093,7 +1094,7 @@ bool KSMShutdownDlg::confirmShutdown( bool maysd, KApplication::ShutdownType& sd return result; } -void KSMShutdownIPDlg::showShutdownIP() +TQWidget* KSMShutdownIPDlg::showShutdownIP() { kapp->enableStyles(); KSMShutdownIPDlg* l = new KSMShutdownIPDlg( 0 ); @@ -1110,17 +1111,26 @@ void KSMShutdownIPDlg::showShutdownIP() timer->start( 0, TRUE ); kapp->disableStyles(); + + return l; } KSMShutdownIPDlg::KSMShutdownIPDlg(TQWidget* parent) -// : TQDialog( 0, "", TRUE, Qt::WStyle_Customize | Qt::WType_Dialog | Qt::WStyle_NoBorder | Qt::WStyle_Title | Qt::WStyle_StaysOnTop | Qt::WDestructiveClose ) - : TQDialog( 0, "", TRUE, Qt::WStyle_Customize | Qt::WType_Popup | Qt::WStyle_NoBorder | Qt::WStyle_Title | Qt::WStyle_StaysOnTop | Qt::WX11BypassWM | Qt::WDestructiveClose ) + : TQDialog( 0, "", TRUE, Qt::WStyle_Customize | Qt::WType_Dialog | Qt::WStyle_Title | Qt::WDestructiveClose ) { + // Signal that this window should stay on top of everything else + setModal(true); + + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(qt_xdisplay(), "_KDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(qt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + TQVBoxLayout* vbox = new TQVBoxLayout( this ); TQFrame* frame = new TQFrame( this ); - frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Raised ); + frame->setFrameStyle( TQFrame::NoFrame ); frame->setLineWidth( tqstyle().tqpixelMetric( TQStyle::PM_DefaultFrameWidth, frame ) ); // we need to set the minimum size for the window frame->setMinimumWidth(400); diff --git a/ksmserver/shutdowndlg.h b/ksmserver/shutdowndlg.h index 0db328a79..72db4b1b1 100644 --- a/ksmserver/shutdowndlg.h +++ b/ksmserver/shutdowndlg.h @@ -144,7 +144,7 @@ class KSMShutdownIPDlg : public TQDialog Q_OBJECT public: - static void showShutdownIP(); + static TQWidget* showShutdownIP(); protected: ~KSMShutdownIPDlg(); diff --git a/kwin/atoms.cpp b/kwin/atoms.cpp index 8b838fdec..165a9e72c 100644 --- a/kwin/atoms.cpp +++ b/kwin/atoms.cpp @@ -81,6 +81,9 @@ Atoms::Atoms() atoms[n] = &net_wm_window_decohash; names[n++] = (char*) "_KDE_WM_WINDOW_DECOHASH"; + + atoms[n] = &net_wm_system_modal_notification; + names[n++] = (char*) "_KDE_WM_MODAL_SYS_NOTIFICATION"; Atom fake; atoms[n] = &fake; diff --git a/kwin/atoms.h b/kwin/atoms.h index caed47b79..ca9e063af 100644 --- a/kwin/atoms.h +++ b/kwin/atoms.h @@ -42,6 +42,7 @@ class Atoms Atom net_wm_window_shade; Atom net_wm_window_shapable; Atom net_wm_window_decohash; + Atom net_wm_system_modal_notification; Atom xdnd_aware; Atom xdnd_position; Atom net_frame_extents; diff --git a/kwin/client.cpp b/kwin/client.cpp index 3205b9ec7..114300821 100644 --- a/kwin/client.cpp +++ b/kwin/client.cpp @@ -499,6 +499,20 @@ void Client::setUserNoBorder( bool set ) updateWindowRules(); } +bool Client::isModalSystemNotification() const + { + unsigned char *data = 0; + Atom actual; + int format, result; + unsigned long n, left; + result = XGetWindowProperty(qt_xdisplay(), window(), atoms->net_wm_system_modal_notification, 0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, /*(unsigned char **)*/ &data); + if (result == Success && data != None && format == 32 ) + { + return TRUE; + } + return FALSE; + } + void Client::updateShape() { // workaround for #19644 - tqshaped windows shouldn't have decoration @@ -603,6 +617,8 @@ bool Client::isMinimizable() const { if( isSpecialWindow()) return false; + if( isModalSystemNotification()) + return false; if( isTransient()) { // #66868 - let other xmms windows be minimized when the mainwindow is minimized bool shown_mainwindow = false; @@ -799,6 +815,8 @@ void Client::setShade( ShadeMode mode ) { if( !isShadeable()) return; + if( isModalSystemNotification()) + return; mode = rules()->checkShade( mode ); if( shade_mode == mode ) return; @@ -1674,6 +1692,8 @@ void Client::sendClientMessage(Window w, Atom a, Atom protocol, long data1, long */ bool Client::isCloseable() const { + if( isModalSystemNotification()) + return false; return rules()->checkCloseable( motif_may_close && !isSpecialWindow()); } diff --git a/kwin/client.h b/kwin/client.h index 4a4ed7025..9ee08efe5 100644 --- a/kwin/client.h +++ b/kwin/client.h @@ -57,6 +57,7 @@ class Client : public TQObject, public KDecorationDefines const Client* transientFor() const; Client* transientFor(); bool isTransient() const; + bool isModalSystemNotification() const; bool groupTransient() const; bool wasOriginallyGroupTransient() const; ClientList mainClients() const; // call once before loop , is not indirect diff --git a/kwin/lib/kcommondecoration.cpp b/kwin/lib/kcommondecoration.cpp index d3d43ce12..4a667c7b4 100644 --- a/kwin/lib/kcommondecoration.cpp +++ b/kwin/lib/kcommondecoration.cpp @@ -35,6 +35,9 @@ #include #include +#include +#include + #include "kcommondecoration.h" #include "kcommondecoration.moc" @@ -318,6 +321,22 @@ int KCommonDecoration::buttonContainerWidth(const ButtonContainer &btnContainer, return w; } +bool KCommonDecoration::isModalSystemNotification() +{ + unsigned char *data = 0; + Atom actual; + int format, result; + unsigned long n, left; + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(qt_xdisplay(), "_KDE_WM_MODAL_SYS_NOTIFICATION", False); + result = XGetWindowProperty(qt_xdisplay(), windowId(), kde_wm_system_modal_notification, 0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, /*(unsigned char **)*/ &data); + if (result == Success && data != None && format == 32 ) + { + return TRUE; + } + return FALSE; +} + void KCommonDecoration::addButtons(ButtonContainer &btnContainer, const TQString& s, bool isLeft) { if (s.length() > 0) { @@ -325,28 +344,32 @@ void KCommonDecoration::addButtons(ButtonContainer &btnContainer, const TQString KCommonDecorationButton *btn = 0; switch (s[n]) { case 'M': // Menu button - if (!m_button[MenuButton]){ - btn = createButton(MenuButton); - if (!btn) break; - btn->setTipText(i18n("Menu") ); - btn->setRealizeButtons(Qt::LeftButton|Qt::RightButton); - connect(btn, TQT_SIGNAL(pressed()), TQT_SLOT(menuButtonPressed())); - connect(btn, TQT_SIGNAL(released()), this, TQT_SLOT(menuButtonReleased())); - - m_button[MenuButton] = btn; + if (!isModalSystemNotification()) { + if (!m_button[MenuButton]){ + btn = createButton(MenuButton); + if (!btn) break; + btn->setTipText(i18n("Menu") ); + btn->setRealizeButtons(Qt::LeftButton|Qt::RightButton); + connect(btn, TQT_SIGNAL(pressed()), TQT_SLOT(menuButtonPressed())); + connect(btn, TQT_SIGNAL(released()), this, TQT_SLOT(menuButtonReleased())); + + m_button[MenuButton] = btn; + } } break; case 'S': // OnAllDesktops button - if (!m_button[OnAllDesktopsButton]){ - btn = createButton(OnAllDesktopsButton); - if (!btn) break; - const bool oad = isOnAllDesktops(); - btn->setTipText(oad?i18n("Not on all desktops"):i18n("On all desktops") ); - btn->setToggleButton(true); - btn->setOn( oad ); - connect(btn, TQT_SIGNAL(clicked()), TQT_SLOT(toggleOnAllDesktops())); - - m_button[OnAllDesktopsButton] = btn; + if (!isModalSystemNotification()) { + if (!m_button[OnAllDesktopsButton]){ + btn = createButton(OnAllDesktopsButton); + if (!btn) break; + const bool oad = isOnAllDesktops(); + btn->setTipText(oad?i18n("Not on all desktops"):i18n("On all desktops") ); + btn->setToggleButton(true); + btn->setOn( oad ); + connect(btn, TQT_SIGNAL(clicked()), TQT_SLOT(toggleOnAllDesktops())); + + m_button[OnAllDesktopsButton] = btn; + } } break; case 'H': // Help button diff --git a/kwin/lib/kcommondecoration.h b/kwin/lib/kcommondecoration.h index 8126445ad..93427b248 100644 --- a/kwin/lib/kcommondecoration.h +++ b/kwin/lib/kcommondecoration.h @@ -266,6 +266,7 @@ class KWIN_EXPORT KCommonDecoration : public KDecoration typedef TQValueVector ButtonContainer; ///< If the entry is 0, it's a spacer. int buttonContainerWidth(const ButtonContainer &btnContainer, bool countHidden = false) const; + bool isModalSystemNotification(); void addButtons(ButtonContainer &btnContainer, const TQString& buttons, bool isLeft); KCommonDecorationButton *m_button[NumButtons];