diff options
Diffstat (limited to 'opensuse/core/tdebase/lowdiskspace.patch')
-rw-r--r-- | opensuse/core/tdebase/lowdiskspace.patch | 413 |
1 files changed, 413 insertions, 0 deletions
diff --git a/opensuse/core/tdebase/lowdiskspace.patch b/opensuse/core/tdebase/lowdiskspace.patch new file mode 100644 index 000000000..a2ee05f54 --- /dev/null +++ b/opensuse/core/tdebase/lowdiskspace.patch @@ -0,0 +1,413 @@ +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> |