You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
414 lines
14 KiB
414 lines
14 KiB
Subject: Dialog notifying about running low on disk space
|
|
From: Lubos Lunak
|
|
Feature: bnc#199054
|
|
Patch-upstream: no
|
|
|
|
Index: kioslave/media/medianotifier/Makefile.am
|
|
===================================================================
|
|
--- kioslave/media/medianotifier/Makefile.am.orig
|
|
+++ kioslave/media/medianotifier/Makefile.am
|
|
@@ -5,7 +5,8 @@ kded_medianotifier_la_LDFLAGS = -module
|
|
kded_medianotifier_la_LIBADD = ../libmediacommon/libmediacommon.la $(LIB_KDECORE) \
|
|
$(LIB_KDEUI) $(LIB_KIO)
|
|
kded_medianotifier_la_SOURCES = medianotifier.cpp medianotifier.skel \
|
|
- notificationdialog.cpp notificationdialogview.ui
|
|
+ notificationdialog.cpp notificationdialogview.ui \
|
|
+ freespacenotifier.cpp freespacewidget.ui
|
|
|
|
noinst_HEADERS = medianotifier.h notificationdialog.h
|
|
|
|
Index: kioslave/media/medianotifier/medianotifier.h
|
|
===================================================================
|
|
--- kioslave/media/medianotifier/medianotifier.h.orig
|
|
+++ kioslave/media/medianotifier/medianotifier.h
|
|
@@ -27,6 +27,8 @@
|
|
#include <qstring.h>
|
|
#include <qmap.h>
|
|
|
|
+class FreeSpaceNotifier;
|
|
+
|
|
class MediaNotifier: public KDEDModule
|
|
{
|
|
Q_OBJECT
|
|
@@ -52,6 +54,8 @@ private:
|
|
const QString &autoopenFile );
|
|
|
|
QMap<KIO::Job*,bool> m_allowNotificationMap;
|
|
+ FreeSpaceNotifier* m_freeSpaceNotifier;
|
|
};
|
|
+
|
|
#endif
|
|
|
|
Index: kioslave/media/medianotifier/medianotifier.cpp
|
|
===================================================================
|
|
--- kioslave/media/medianotifier/medianotifier.cpp.orig
|
|
+++ kioslave/media/medianotifier/medianotifier.cpp
|
|
@@ -36,6 +36,7 @@
|
|
#include "notifiersettings.h"
|
|
#include "notifieraction.h"
|
|
#include "mediamanagersettings.h"
|
|
+#include "freespacenotifier.h"
|
|
|
|
MediaNotifier::MediaNotifier(const QCString &name) : KDEDModule(name)
|
|
{
|
|
@@ -44,6 +45,8 @@ MediaNotifier::MediaNotifier(const QCStr
|
|
|
|
connectDCOPSignal( "kded", "mediamanager", "mediumChanged(QString, bool)",
|
|
"onMediumChange(QString, bool)", true );
|
|
+
|
|
+ m_freeSpaceNotifier = new FreeSpaceNotifier( this );
|
|
}
|
|
|
|
MediaNotifier::~MediaNotifier()
|
|
@@ -53,6 +56,7 @@ MediaNotifier::~MediaNotifier()
|
|
|
|
disconnectDCOPSignal( "kded", "mediamanager", "mediumChanged(QString, bool)",
|
|
"onMediumChange(QString, bool)" );
|
|
+ delete m_freeSpaceNotifier;
|
|
}
|
|
|
|
void MediaNotifier::onMediumChange( const QString &name, bool allowNotification )
|
|
Index: kioslave/media/medianotifier/freespacenotifier.cpp
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ kioslave/media/medianotifier/freespacenotifier.cpp
|
|
@@ -0,0 +1,159 @@
|
|
+/* This file is part of the KDE Project
|
|
+ Copyright (c) 2006 Lukas Tinkl <ltinkl@suse.cz>
|
|
+ Copyright (c) 2008 Lubos Lunak <l.lunak@suse.cz>
|
|
+
|
|
+ This program is free software; you can redistribute it and/or modify
|
|
+ it under the terms of the GNU General Public License as published by
|
|
+ the Free Software Foundation; either version 2 of the License, or
|
|
+ (at your option) any later version.
|
|
+
|
|
+ This program is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ GNU General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU General Public License
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
+*/
|
|
+
|
|
+#include "freespacenotifier.h"
|
|
+
|
|
+#include <sys/vfs.h>
|
|
+#include <unistd.h>
|
|
+
|
|
+#include <qdir.h>
|
|
+#include <qfile.h>
|
|
+#include <qlabel.h>
|
|
+#include <qspinbox.h>
|
|
+
|
|
+#include <kconfig.h>
|
|
+#include <kdebug.h>
|
|
+#include <klocale.h>
|
|
+#include <krun.h>
|
|
+
|
|
+#include "freespacewidget.h"
|
|
+
|
|
+
|
|
+FreeSpaceNotifier::FreeSpaceNotifier( QObject* parent )
|
|
+ : QObject( parent )
|
|
+ , lastAvailTimer( NULL )
|
|
+ , dialog( NULL )
|
|
+ , lastAvail( -1 )
|
|
+{
|
|
+ connect( &timer, SIGNAL( timeout() ), SLOT( checkFreeDiskSpace() ) );
|
|
+ KConfig cfg( "lowspacesuse", true ); // read only
|
|
+ KConfigGroup group( &cfg, "General" );
|
|
+ limit = group.readNumEntry( "WarnMinimumFreeSpace", 200 ); // MiB
|
|
+ if( limit != 0 )
|
|
+ timer.start( 1000 * 60 /* 1 minute */ );
|
|
+}
|
|
+
|
|
+FreeSpaceNotifier::~FreeSpaceNotifier()
|
|
+{
|
|
+ delete dialog;
|
|
+}
|
|
+
|
|
+void FreeSpaceNotifier::checkFreeDiskSpace()
|
|
+{
|
|
+ if ( dialog )
|
|
+ return;
|
|
+ struct statfs sfs;
|
|
+ if ( statfs( QFile::encodeName( QDir::homeDirPath() ), &sfs ) == 0 )
|
|
+ {
|
|
+ long avail = ( getuid() ? sfs.f_bavail : sfs.f_bfree );
|
|
+
|
|
+ if (avail < 0 || sfs.f_blocks <= 0)
|
|
+ return; // we better do not say anything about it
|
|
+
|
|
+ int availpct = int( 100 * avail / sfs.f_blocks );
|
|
+ avail = ((long long)avail) * sfs.f_bsize / ( 1024 * 1024 ); // to MiB
|
|
+ bool warn = false;
|
|
+ if( avail < limit ) // avail disk space dropped under a limit
|
|
+ {
|
|
+ if( lastAvail < 0 ) // always warn the first time
|
|
+ {
|
|
+ lastAvail = avail;
|
|
+ warn = true;
|
|
+ }
|
|
+ else if( avail > lastAvail ) // the user freed some space
|
|
+ lastAvail = avail; // so warn if it goes low again
|
|
+ else if( avail < lastAvail * 0.5 ) // available dropped to a half of previous one, warn again
|
|
+ {
|
|
+ warn = true;
|
|
+ lastAvail = avail;
|
|
+ }
|
|
+ // do not change lastAvail otherwise, to handle free space slowly going down
|
|
+ }
|
|
+ if ( warn )
|
|
+ {
|
|
+ dialog = new KDialogBase(
|
|
+ i18n( "Low Disk Space" ),
|
|
+ KDialogBase::Yes | KDialogBase::No | KDialogBase::Cancel,
|
|
+ KDialogBase::Yes, KDialogBase::No,
|
|
+ 0, "lowdiskspacedialog", false, true,
|
|
+ i18n( "Open File Manager" ), i18n( "Do Nothing" ), i18n( "Disable Warning" ));
|
|
+ widget = new FreeSpaceWidget( dialog );
|
|
+ dialog->setMainWidget( widget );
|
|
+
|
|
+ QString text = i18n( "You are running low on disk space on your home partition (currently %2%, %1 MiB free)." )
|
|
+ .arg( avail ).arg( availpct );
|
|
+ widget->warningLabel->setText( text );
|
|
+ widget->spinbox->setMinValue( 0 );
|
|
+ widget->spinbox->setMaxValue( 100000 );
|
|
+ widget->spinbox->setValue( limit );
|
|
+ connect( dialog, SIGNAL( yesClicked() ), SLOT( slotYes() ) );
|
|
+ connect( dialog, SIGNAL( noClicked() ), SLOT( slotNo() ) );
|
|
+ connect( dialog, SIGNAL( cancelClicked() ), SLOT( slotCancel() ) );
|
|
+ dialog->show();
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+void FreeSpaceNotifier::slotYes()
|
|
+{
|
|
+ ( void ) new KRun( KURL::fromPathOrURL( QDir::homeDirPath() ) );
|
|
+ cleanupDialog( widget->spinbox->value());
|
|
+}
|
|
+
|
|
+void FreeSpaceNotifier::slotNo()
|
|
+{
|
|
+ cleanupDialog( widget->spinbox->value());
|
|
+}
|
|
+
|
|
+void FreeSpaceNotifier::slotCancel()
|
|
+{
|
|
+ cleanupDialog( 0 ); // set limit to zero
|
|
+}
|
|
+
|
|
+void FreeSpaceNotifier::cleanupDialog( long newLimit )
|
|
+{
|
|
+ dialog->deleteLater();
|
|
+ dialog = NULL;
|
|
+ if( limit != newLimit )
|
|
+ {
|
|
+ KConfig cfg( "lowspacesuse" );
|
|
+ KConfigGroup group( &cfg, "General" );
|
|
+ limit = newLimit;
|
|
+ group.writeEntry( "WarnMinimumFreeSpace", limit );
|
|
+ if( limit == 0 )
|
|
+ timer.stop();
|
|
+ }
|
|
+ if( limit != 0 )
|
|
+ { // warn again if constanly below limit for too long
|
|
+ if( lastAvailTimer == NULL )
|
|
+ {
|
|
+ lastAvailTimer = new QTimer( this );
|
|
+ connect( lastAvailTimer, SIGNAL( timeout()), SLOT( resetLastAvailable()));
|
|
+ }
|
|
+ lastAvailTimer->start( 1000 * 60 * 60 /* 1 hour*/ );
|
|
+ }
|
|
+}
|
|
+
|
|
+void FreeSpaceNotifier::resetLastAvailable()
|
|
+{
|
|
+ lastAvail = -1;
|
|
+ lastAvailTimer->deleteLater();
|
|
+ lastAvailTimer = NULL;
|
|
+}
|
|
+
|
|
+#include "freespacenotifier.moc"
|
|
Index: kioslave/media/medianotifier/freespacenotifier.h
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ kioslave/media/medianotifier/freespacenotifier.h
|
|
@@ -0,0 +1,51 @@
|
|
+/* This file is part of the KDE Project
|
|
+ Copyright (c) 2006 Lukas Tinkl <ltinkl@suse.cz>
|
|
+ Copyright (c) 2008 Lubos Lunak <l.lunak@suse.cz>
|
|
+
|
|
+ This program is free software; you can redistribute it and/or modify
|
|
+ it under the terms of the GNU General Public License as published by
|
|
+ the Free Software Foundation; either version 2 of the License, or
|
|
+ (at your option) any later version.
|
|
+
|
|
+ This program is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ GNU General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU General Public License
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
+*/
|
|
+
|
|
+#ifndef _FREESPACENOTIFIER_H_
|
|
+#define _FREESPACENOTIFIER_H_
|
|
+
|
|
+#include <qtimer.h>
|
|
+
|
|
+#include <kdialogbase.h>
|
|
+
|
|
+class FreeSpaceWidget;
|
|
+
|
|
+class FreeSpaceNotifier
|
|
+: public QObject
|
|
+{
|
|
+ Q_OBJECT
|
|
+ public:
|
|
+ FreeSpaceNotifier( QObject* parent = NULL );
|
|
+ virtual ~FreeSpaceNotifier();
|
|
+ private slots:
|
|
+ void checkFreeDiskSpace();
|
|
+ void resetLastAvailable();
|
|
+ void slotYes();
|
|
+ void slotNo();
|
|
+ void slotCancel();
|
|
+ private:
|
|
+ void cleanupDialog( long newLimit );
|
|
+ QTimer timer;
|
|
+ QTimer* lastAvailTimer;
|
|
+ KDialogBase* dialog;
|
|
+ FreeSpaceWidget* widget;
|
|
+ long limit;
|
|
+ long lastAvail; // used to supress repeated warnings when available space hasn't changed
|
|
+};
|
|
+
|
|
+#endif
|
|
Index: kioslave/media/medianotifier/freespacewidget.ui
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ kioslave/media/medianotifier/freespacewidget.ui
|
|
@@ -0,0 +1,118 @@
|
|
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
|
|
+<class>FreeSpaceWidget</class>
|
|
+<widget class="QWidget">
|
|
+ <property name="name">
|
|
+ <cstring>Form1</cstring>
|
|
+ </property>
|
|
+ <property name="geometry">
|
|
+ <rect>
|
|
+ <x>0</x>
|
|
+ <y>0</y>
|
|
+ <width>489</width>
|
|
+ <height>108</height>
|
|
+ </rect>
|
|
+ </property>
|
|
+ <property name="caption">
|
|
+ <string>Form1</string>
|
|
+ </property>
|
|
+ <vbox>
|
|
+ <property name="name">
|
|
+ <cstring>unnamed</cstring>
|
|
+ </property>
|
|
+ <widget class="QLabel">
|
|
+ <property name="name">
|
|
+ <cstring>warningLabel</cstring>
|
|
+ </property>
|
|
+ <property name="text">
|
|
+ <string></string>
|
|
+ </property>
|
|
+ </widget>
|
|
+ <widget class="QLabel">
|
|
+ <property name="name">
|
|
+ <cstring>textLabel2</cstring>
|
|
+ </property>
|
|
+ <property name="text">
|
|
+ <string>Would you like to run a file manager to free some disk space and fix the problem?</string>
|
|
+ </property>
|
|
+ </widget>
|
|
+ <spacer>
|
|
+ <property name="name">
|
|
+ <cstring>spacer3</cstring>
|
|
+ </property>
|
|
+ <property name="orientation">
|
|
+ <enum>Vertical</enum>
|
|
+ </property>
|
|
+ <property name="sizeType">
|
|
+ <enum>Expanding</enum>
|
|
+ </property>
|
|
+ <property name="sizeHint">
|
|
+ <size>
|
|
+ <width>20</width>
|
|
+ <height>40</height>
|
|
+ </size>
|
|
+ </property>
|
|
+ </spacer>
|
|
+ <widget class="QLayoutWidget">
|
|
+ <property name="name">
|
|
+ <cstring>layout3</cstring>
|
|
+ </property>
|
|
+ <hbox>
|
|
+ <property name="name">
|
|
+ <cstring>unnamed</cstring>
|
|
+ </property>
|
|
+ <widget class="QLabel">
|
|
+ <property name="name">
|
|
+ <cstring>textLabel3</cstring>
|
|
+ </property>
|
|
+ <property name="text">
|
|
+ <string>Warn again when the free space is below</string>
|
|
+ </property>
|
|
+ </widget>
|
|
+ <widget class="QSpinBox">
|
|
+ <property name="name">
|
|
+ <cstring>spinbox</cstring>
|
|
+ </property>
|
|
+ <property name="suffix">
|
|
+ <string> MiB</string>
|
|
+ </property>
|
|
+ </widget>
|
|
+ <spacer>
|
|
+ <property name="name">
|
|
+ <cstring>spacer1</cstring>
|
|
+ </property>
|
|
+ <property name="orientation">
|
|
+ <enum>Horizontal</enum>
|
|
+ </property>
|
|
+ <property name="sizeType">
|
|
+ <enum>Expanding</enum>
|
|
+ </property>
|
|
+ <property name="sizeHint">
|
|
+ <size>
|
|
+ <width>30</width>
|
|
+ <height>20</height>
|
|
+ </size>
|
|
+ </property>
|
|
+ </spacer>
|
|
+ </hbox>
|
|
+ </widget>
|
|
+ <spacer>
|
|
+ <property name="name">
|
|
+ <cstring>spacer2</cstring>
|
|
+ </property>
|
|
+ <property name="orientation">
|
|
+ <enum>Vertical</enum>
|
|
+ </property>
|
|
+ <property name="sizeType">
|
|
+ <enum>Expanding</enum>
|
|
+ </property>
|
|
+ <property name="sizeHint">
|
|
+ <size>
|
|
+ <width>20</width>
|
|
+ <height>16</height>
|
|
+ </size>
|
|
+ </property>
|
|
+ </spacer>
|
|
+ </vbox>
|
|
+</widget>
|
|
+<layoutdefaults spacing="6" margin="11"/>
|
|
+</UI>
|