If we have way too many crashes (>= 4) then offer to run an alternative window manager.
svn path=/trunk/KDE/kdebase/workspace/; revision=717806
This commit is contained in:
parent
853701e9aa
commit
26ce55a738
1 changed files with 63 additions and 1 deletions
64
main.cpp
64
main.cpp
|
@ -28,6 +28,11 @@ License. See the file "COPYING" for the exact licensing terms.
|
||||||
#include <fixx11h.h>
|
#include <fixx11h.h>
|
||||||
#include <QtDBus/QtDBus>
|
#include <QtDBus/QtDBus>
|
||||||
|
|
||||||
|
#include <kdialog.h>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
#include "atoms.h"
|
#include "atoms.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "sm.h"
|
#include "sm.h"
|
||||||
|
@ -85,6 +90,46 @@ int x11ErrorHandler(Display *d, XErrorEvent *e)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AlternativeWMDialog : public KDialog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AlternativeWMDialog() : KDialog()
|
||||||
|
{
|
||||||
|
setButtons( KDialog::Ok );
|
||||||
|
|
||||||
|
QWidget* mainWidget = new QWidget( this );
|
||||||
|
QVBoxLayout* layout = new QVBoxLayout( mainWidget );
|
||||||
|
QString text = i18n("KWin is unstable.\n"
|
||||||
|
"It seems to have crashed several times in a row.\n"
|
||||||
|
"You can select another window manager to run:");
|
||||||
|
QLabel* textLabel = new QLabel( text, mainWidget );
|
||||||
|
layout->addWidget( textLabel );
|
||||||
|
wmList = new QComboBox( mainWidget );
|
||||||
|
wmList->setEditable( true );
|
||||||
|
layout->addWidget( wmList );
|
||||||
|
|
||||||
|
addWM( "metacity" );
|
||||||
|
addWM( "openbox" );
|
||||||
|
addWM( "fvwm2" );
|
||||||
|
addWM( "kwin" );
|
||||||
|
|
||||||
|
setMainWidget(mainWidget);
|
||||||
|
|
||||||
|
raise();
|
||||||
|
centerOnScreen( this );
|
||||||
|
}
|
||||||
|
void addWM( const QString& wm )
|
||||||
|
{
|
||||||
|
// TODO: check if wm is installed
|
||||||
|
wmList->addItem( wm );
|
||||||
|
}
|
||||||
|
QString selectedWM() const { return wmList->currentText(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QComboBox* wmList;
|
||||||
|
};
|
||||||
|
|
||||||
int Application::crashes = 0;
|
int Application::crashes = 0;
|
||||||
|
|
||||||
Application::Application( )
|
Application::Application( )
|
||||||
|
@ -111,6 +156,23 @@ Application::Application( )
|
||||||
|
|
||||||
KCrash::setEmergencySaveFunction( Application::crashHandler );
|
KCrash::setEmergencySaveFunction( Application::crashHandler );
|
||||||
crashes = args->getOption("crashes").toInt();
|
crashes = args->getOption("crashes").toInt();
|
||||||
|
if(crashes >= 4)
|
||||||
|
{
|
||||||
|
// Something has gone seriously wrong
|
||||||
|
AlternativeWMDialog dialog;
|
||||||
|
dialog.exec();
|
||||||
|
QString cmd = dialog.selectedWM();
|
||||||
|
if( cmd.length() > 500 )
|
||||||
|
{
|
||||||
|
kDebug() << "Command is too long, truncating";
|
||||||
|
cmd = cmd.left(500);
|
||||||
|
}
|
||||||
|
kDebug() << "Starting" << cmd << "and exiting";
|
||||||
|
char buf[1024];
|
||||||
|
sprintf(buf, "%s &", cmd.toAscii().data());
|
||||||
|
system(buf);
|
||||||
|
::exit(1);
|
||||||
|
}
|
||||||
// Disable compositing if we have had too many crashes
|
// Disable compositing if we have had too many crashes
|
||||||
if( crashes >= 2 )
|
if( crashes >= 2 )
|
||||||
{
|
{
|
||||||
|
@ -176,7 +238,7 @@ void Application::lostSelection()
|
||||||
|
|
||||||
bool Application::x11EventFilter( XEvent *e )
|
bool Application::x11EventFilter( XEvent *e )
|
||||||
{
|
{
|
||||||
if ( Workspace::self()->workspaceEvent( e ) )
|
if ( Workspace::self() && Workspace::self()->workspaceEvent( e ) )
|
||||||
return true;
|
return true;
|
||||||
return KApplication::x11EventFilter( e );
|
return KApplication::x11EventFilter( e );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue