From 6342dc39907a647a0fd9f84b3ba143cef4792877 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Wed, 17 Apr 2013 17:22:17 -0500 Subject: Fix a number of issues related to the media kioslave --- kcheckpass/checkpass_pam.c | 2 + kcontrol/konq/desktopbehavior.ui | 10 +- kcontrol/konq/desktopbehavior_impl.cpp | 4 + kdesktop/kdesktop.kcfg | 5 + kdesktop/kdiconview.cc | 144 ++++++++++++++++++++---- kdesktop/kdiconview.h | 11 ++ kdesktop/lock/lockdlg.cc | 9 +- kdesktop/tdefileividesktop.cpp | 1 + kicker/kicker/buttons/kbutton.cpp | 10 +- kicker/kicker/core/container_button.cpp | 13 ++- kicker/libkicker/kickerSettings.kcfg | 5 + libkonq/tdefileivi.cc | 36 ++++-- tdeioslave/media/services/media_unmount.desktop | 2 +- 13 files changed, 209 insertions(+), 43 deletions(-) diff --git a/kcheckpass/checkpass_pam.c b/kcheckpass/checkpass_pam.c index 44758b696..7a35eeddf 100644 --- a/kcheckpass/checkpass_pam.c +++ b/kcheckpass/checkpass_pam.c @@ -177,6 +177,8 @@ AuthReturn Authenticate(const char *caller, const char *method, case PAM_MAXTRIES: /* should handle this better ... */ case PAM_AUTHINFO_UNAVAIL: /* returned for unknown users ... bogus */ return AuthBad; + case PAM_SERVICE_ERR: + return AuthError; default: return AuthError; } diff --git a/kcontrol/konq/desktopbehavior.ui b/kcontrol/konq/desktopbehavior.ui index e6acb6ed6..dc4907adf 100644 --- a/kcontrol/konq/desktopbehavior.ui +++ b/kcontrol/konq/desktopbehavior.ui @@ -370,7 +370,15 @@ enableMediaBox - &Show device icons: + &Show device icons + + + + + enableMediaFreeSpaceOverlayBox + + + &Show free space overlay on device icons diff --git a/kcontrol/konq/desktopbehavior_impl.cpp b/kcontrol/konq/desktopbehavior_impl.cpp index d9920e8ad..b54bf8e17 100644 --- a/kcontrol/konq/desktopbehavior_impl.cpp +++ b/kcontrol/konq/desktopbehavior_impl.cpp @@ -220,6 +220,7 @@ DesktopBehavior::DesktopBehavior(TDEConfig *config, TQWidget *parent, const char if (m_bHasMedia) { connect(enableMediaBox, TQT_SIGNAL(clicked()), this, TQT_SLOT(enableChanged())); + connect(enableMediaFreeSpaceOverlayBox, TQT_SIGNAL(clicked()), this, TQT_SLOT(enableChanged())); } else { @@ -255,6 +256,7 @@ void DesktopBehavior::fillMediaListView() TQValueListIterator it2(mimetypes.begin()); g_pConfig->setGroup( "Media" ); enableMediaBox->setChecked(g_pConfig->readBoolEntry("enabled",false)); + enableMediaFreeSpaceOverlayBox->setChecked(g_pConfig->readBoolEntry("FreeSpaceDisplayEnabled",true)); TQString excludedMedia=g_pConfig->readEntry("exclude","media/hdd_mounted,media/hdd_unmounted,media/floppy_unmounted,media/cdrom_unmounted,media/floppy5_unmounted"); for (; it2 != mimetypes.end(); ++it2) { if ( ((*it2)->name().startsWith("media/")) ) @@ -272,6 +274,7 @@ void DesktopBehavior::saveMediaListView() g_pConfig->setGroup( "Media" ); g_pConfig->writeEntry("enabled",enableMediaBox->isChecked()); + g_pConfig->writeEntry("FreeSpaceDisplayEnabled",enableMediaFreeSpaceOverlayBox->isChecked()); TQStringList exclude; for (DesktopBehaviorMediaItem *it=static_cast(mediaListView->firstChild()); it; it=static_cast(it->nextSibling())) @@ -423,6 +426,7 @@ void DesktopBehavior::enableChanged() { behaviorTab->setTabEnabled(behaviorTab->page(2), enabled); enableMediaBox->setEnabled(enabled); + enableMediaFreeSpaceOverlayBox->setEnabled(enabled); setMediaListViewEnabled(enableMediaBox->isChecked()); } diff --git a/kdesktop/kdesktop.kcfg b/kdesktop/kdesktop.kcfg index 2895db99d..9fbccea9e 100644 --- a/kdesktop/kdesktop.kcfg +++ b/kdesktop/kdesktop.kcfg @@ -209,6 +209,11 @@ + + true + + + diff --git a/kdesktop/kdiconview.cc b/kdesktop/kdiconview.cc index 9b8311828..7aa500162 100644 --- a/kdesktop/kdiconview.cc +++ b/kdesktop/kdiconview.cc @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -148,7 +149,8 @@ KDIconView::KDIconView( TQWidget *parent, const char* name ) m_bSortDirectoriesFirst( true ), m_itemsAlwaysFirst(), m_gotIconsArea(false), - m_needDesktopAlign(true) + m_needDesktopAlign(true), + m_paOutstandingOverlaysTimer( 0L ) { setResizeMode( Fixed ); setIconArea( desktopRect() ); // the default is the whole desktop @@ -159,8 +161,7 @@ KDIconView::KDIconView( TQWidget *parent, const char* name ) // Initialize media handler mMediaListView = new TQListView(); - connect( TQApplication::clipboard(), TQT_SIGNAL(dataChanged()), - this, TQT_SLOT(slotClipboardDataChanged()) ); + connect( TQApplication::clipboard(), TQT_SIGNAL(dataChanged()), this, TQT_SLOT(slotClipboardDataChanged()) ); setURL( desktopURL() ); // sets m_url @@ -298,10 +299,12 @@ void KDIconView::initConfig( bool init ) m_bSortDirectoriesFirst = KDesktopSettings::directoriesFirst(); m_itemsAlwaysFirst = KDesktopSettings::alwaysFirstItems(); // Distributor plug-in - if (KProtocolInfo::isKnownProtocol(TQString::fromLatin1("media"))) + if (KProtocolInfo::isKnownProtocol(TQString::fromLatin1("media"))) { m_enableMedia=KDesktopSettings::mediaEnabled(); - else + } + else { m_enableMedia=false; + } TQString tmpList=KDesktopSettings::exclude(); kdDebug(1204)<<"m_excludeList"<setShowingDotFiles( m_bShowDot ); m_dirLister->emitChanges(); } + slotFreeSpaceOverlaySettingChanged(); setArrangement(m_bVertAlign ? TopToBottom : LeftToRight); @@ -666,24 +670,27 @@ void KDIconView::slotMouseButtonPressed(int _button, TQIconViewItem* _item, cons //kdDebug(1204) << "KDIconView::slotMouseButtonPressed" << endl; if (!m_dirLister) return; m_lastDeletedIconPos = TQPoint(); // user action -> not renaming an icon - if(!_item) + if(!_item) { KRootWm::self()->mousePressed( _global, _button ); + } } void KDIconView::slotMouseButtonClickedKDesktop(int _button, TQIconViewItem* _item, const TQPoint&) { if (!m_dirLister) return; //kdDebug(1204) << "KDIconView::slotMouseButtonClickedKDesktop" << endl; - if ( _item && _button == Qt::MidButton ) + if ( _item && _button == Qt::MidButton ) { slotExecuted(_item); + } } // ----------------------------------------------------------------------------- void KDIconView::slotReturnPressed( TQIconViewItem *item ) { - if (item && item->isSelected()) + if (item && item->isSelected()) { slotExecuted(item); + } } // ----------------------------------------------------------------------------- @@ -992,8 +999,9 @@ bool KDIconView::makeFriendlyText( KFileIVI *fileIVI ) u.addPath( ".directory" ); // using TDEStandardDirs as this one checks for path being // a file instead of a directory - if ( TDEStandardDirs::exists( u.path() ) ) + if ( TDEStandardDirs::exists( u.path() ) ) { desktopFile = u.path(); + } } else if ( isDesktopFile( item ) ) { @@ -1004,36 +1012,44 @@ bool KDIconView::makeFriendlyText( KFileIVI *fileIVI ) { KSimpleConfig cfg( desktopFile, true ); cfg.setDesktopGroup(); - if (cfg.readBoolEntry("Hidden")) + if (cfg.readBoolEntry("Hidden")) { return false; + } - if (cfg.readBoolEntry( "NoDisplay", false )) + if (cfg.readBoolEntry( "NoDisplay", false )) { return false; + } TQStringList tmpList; if (cfg.hasKey("OnlyShowIn")) { - if (!cfg.readListEntry("OnlyShowIn", ';').contains("TDE")) + if (!cfg.readListEntry("OnlyShowIn", ';').contains("TDE")) { return false; + } } if (cfg.hasKey("NotShowIn")) { - if (cfg.readListEntry("NotShowIn", ';').contains("TDE")) + if (cfg.readListEntry("NotShowIn", ';').contains("TDE")) { return false; + } } if (cfg.hasKey("TryExec")) { - if (TDEStandardDirs::findExe( cfg.readEntry( "TryExec" ) ).isEmpty()) + if (TDEStandardDirs::findExe( cfg.readEntry( "TryExec" ) ).isEmpty()) { return false; + } } TQString name = cfg.readEntry("Name"); - if ( !name.isEmpty() ) + if ( !name.isEmpty() ) { fileIVI->setText( name ); - else + } + else { // For compatibility fileIVI->setText( stripDesktopExtension( fileIVI->text() ) ); + } } + return true; } @@ -1057,8 +1073,9 @@ void KDIconView::slotNewItems( const KFileItemList & entries ) TQString desktopPath; KURL desktop_URL = desktopURL(); - if (desktop_URL.isLocalFile()) + if (desktop_URL.isLocalFile()) { desktopPath = desktop_URL.path(); + } // We have new items, so we'll need to repaint in slotCompleted m_bNeedRepaint = true; kdDebug(1214) << "KDIconView::slotNewItems count=" << entries.count() << endl; @@ -1090,12 +1107,14 @@ void KDIconView::slotNewItems( const KFileItemList & entries ) if (!desktopPath.isEmpty() && url.isLocalFile() && !url.path().startsWith(desktopPath)) { TQString fileName = url.fileName(); - if (TQFile::exists(desktopPath + fileName)) + if (TQFile::exists(desktopPath + fileName)) { continue; // Don't duplicate entry + } TQString mostLocal = locate("appdata", "Desktop/"+fileName); - if (!mostLocal.isEmpty() && (mostLocal != url.path())) + if (!mostLocal.isEmpty() && (mostLocal != url.path())) { continue; // Don't duplicate entry + } } // No delayed mimetype determination on the desktop @@ -1197,6 +1216,11 @@ void KDIconView::slotNewItems( const KFileItemList & entries ) newItemsList.append(fileIVI); } } + + KFileItem* fileItem = fileIVI->item(); + if ( fileItem->mimetype().startsWith("media/") && fileItem->mimetype().contains("_mounted") && KDesktopSettings::mediaFreeSpaceDisplayEnabled() ) { + showFreeSpaceOverlay(fileIVI); + } } KFileIVIList::iterator newitemit; @@ -1249,8 +1273,12 @@ void KDIconView::slotRefreshItems( const KFileItemList & entries ) } else fileIVI->refreshIcon( true ); - if ( rit.current()->isMimeTypeKnown() ) + if ( rit.current()->isMimeTypeKnown() ) { fileIVI->setMouseOverAnimation( rit.current()->iconName() ); + } + if ( rit.current()->mimetype().startsWith("media/") && rit.current()->mimetype().contains("_mounted") && KDesktopSettings::mediaFreeSpaceDisplayEnabled() ) { + showFreeSpaceOverlay(fileIVI); + } break; } } @@ -1286,16 +1314,18 @@ void KDIconView::refreshIcons() void KDIconView::FilesAdded( const KURL & directory ) { - if ( directory.path().length() <= 1 && directory.protocol() == "trash" ) + if ( directory.path().length() <= 1 && directory.protocol() == "trash" ) { refreshTrashIcon(); + } } void KDIconView::FilesRemoved( const KURL::List & fileList ) { if ( !fileList.isEmpty() ) { const KURL url = fileList.first(); - if ( url.protocol() == "trash" ) + if ( url.protocol() == "trash" ) { refreshTrashIcon(); + } } } @@ -1317,6 +1347,73 @@ void KDIconView::refreshTrashIcon() } } +void KDIconView::slotFreeSpaceOverlaySettingChanged() +{ + bool show = KDesktopSettings::mediaFreeSpaceDisplayEnabled(); + + for ( TQIconViewItem *item = firstItem(); item; item = item->nextItem() ) + { + KFileIVI* kItem = static_cast(item); + if ( !kItem->item()->isDir() ) continue; + + if (show) { + showFreeSpaceOverlay(kItem); + } else { + kItem -> setShowFreeSpaceOverlay(false); + } + } + + updateContents(); +} + +void KDIconView::showFreeSpaceOverlay(KFileIVI* item) +{ + KFileItem* fileItem = item->item(); + + if ( TDEGlobalSettings::showFilePreview( fileItem->url() ) ) { + m_paOutstandingOverlays.append(item); + if (m_paOutstandingOverlays.count() == 1) + { + if (!m_paOutstandingOverlaysTimer) + { + m_paOutstandingOverlaysTimer = new TQTimer(this); + connect(m_paOutstandingOverlaysTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotFreeSpaceOverlayStart())); + } + m_paOutstandingOverlaysTimer->start(20, true); + } + } +} + +void KDIconView::slotFreeSpaceOverlayStart() +{ + do + { + KFileIVI* item = m_paOutstandingOverlays.first(); + if (!item) { + return; // Nothing to do + } + + KIVFreeSpaceOverlay* overlay = item->setShowFreeSpaceOverlay( true ); + + if (overlay) + { + connect( overlay, TQT_SIGNAL( finished() ), this, TQT_SLOT( slotFreeSpaceOverlayFinished() ) ); + overlay->start(); // Watch out, may emit finished() immediately!! + return; // Let it run.... + } + m_paOutstandingOverlays.removeFirst(); + } while (true); +} + +void KDIconView::slotFreeSpaceOverlayFinished() +{ + m_paOutstandingOverlays.removeFirst(); + + if (m_paOutstandingOverlays.count() > 0) { + m_paOutstandingOverlaysTimer->start(0, true); // Don't call directly to prevent deep recursion. + } +} + // ----------------------------------------------------------------------------- void KDIconView::slotDeleteItem( KFileItem * _fileitem ) @@ -1332,8 +1429,9 @@ void KDIconView::slotDeleteItem( KFileItem * _fileitem ) TQString group = iconPositionGroupPrefix(); group.append( fileIVI->item()->url().fileName() ); - if ( m_dotDirectory->hasGroup( group ) ) + if ( m_dotDirectory->hasGroup( group ) ) { m_dotDirectory->deleteGroup( group ); + } m_lastDeletedIconPos = fileIVI->pos(); delete fileIVI; diff --git a/kdesktop/kdiconview.h b/kdesktop/kdiconview.h index c18b0d9d5..963c10a2b 100644 --- a/kdesktop/kdiconview.h +++ b/kdesktop/kdiconview.h @@ -20,6 +20,7 @@ #ifndef kdiconview_h #define kdiconview_h +#include #include #include @@ -164,6 +165,10 @@ public slots: void slotClear(); void refreshIcons(); +protected slots: + void slotFreeSpaceOverlayStart(); + void slotFreeSpaceOverlayFinished(); + void slotFreeSpaceOverlaySettingChanged(); protected: void createActions(); @@ -199,6 +204,8 @@ private: static void saveIconPosition(KSimpleConfig *config, int x, int y); static void readIconPosition(KSimpleConfig *config, int &x, int &y); + void showFreeSpaceOverlay(KFileIVI* item); + /** Our action collection, parent of all our actions */ TDEActionCollection m_actionCollection; @@ -270,6 +277,10 @@ private: bool m_needDesktopAlign; TQListView *mMediaListView; + + TQPtrList m_paOutstandingOverlays; + TQTimer *m_paOutstandingOverlaysTimer; + TDEConfig *g_pConfig; }; diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc index a3fe9828c..d401f0b2f 100644 --- a/kdesktop/lock/lockdlg.cc +++ b/kdesktop/lock/lockdlg.cc @@ -422,8 +422,8 @@ void PasswordDlg::reapVerify() { ::close( sFd ); int status; - ::waitpid( sPid, &status, 0 ); - if (WIFEXITED(status)) + pid_t retpid = ::waitpid( sPid, &status, 0 ); + if (WIFEXITED(status)) { switch (WEXITSTATUS(status)) { case AuthOk: greet->succeeded(); @@ -441,6 +441,11 @@ void PasswordDlg::reapVerify() case AuthAbort: return; } + } + else if (WIFSIGNALED(status)) { + // FIXME + // ERROR + } cantCheck(); } diff --git a/kdesktop/tdefileividesktop.cpp b/kdesktop/tdefileividesktop.cpp index 7d20e4d81..18ba4c156 100644 --- a/kdesktop/tdefileividesktop.cpp +++ b/kdesktop/tdefileividesktop.cpp @@ -115,6 +115,7 @@ void KFileIVIDesktop::paintItem( TQPainter *p, const TQColorGroup &cg) p->restore(); paintOverlay(p); + paintOverlayProgressBar(p); } bool KFileIVIDesktop::shouldUpdateShadow(bool selected) diff --git a/kicker/kicker/buttons/kbutton.cpp b/kicker/kicker/buttons/kbutton.cpp index 88b664059..6e934eb4f 100644 --- a/kicker/kicker/buttons/kbutton.cpp +++ b/kicker/kicker/buttons/kbutton.cpp @@ -56,8 +56,8 @@ KButton::KButton( TQWidget* parent ) setButtonText(KickerSettings::kMenuText()); setFont(KickerSettings::buttonFont()); setTextColor(KickerSettings::buttonTextColor()); - setMaximumHeight(30); - setMaximumWidth(widthForHeight(30)); + setMaximumHeight(KickerSettings::maximumTDEMenuButtonHeight()); + setMaximumWidth(widthForHeight(KickerSettings::maximumTDEMenuButtonHeight())); setCenterButtonInContainer(false); } } @@ -70,7 +70,7 @@ KButton::~KButton() int KButton::widthForHeight(int height) const { if (KickerSettings::showKMenuText()) { - return PanelPopupButton::widthForHeight(30); + return PanelPopupButton::widthForHeight((height>KickerSettings::maximumTDEMenuButtonHeight())?KickerSettings::maximumTDEMenuButtonHeight():height); } else { return PanelPopupButton::widthForHeight(height); @@ -80,7 +80,9 @@ int KButton::widthForHeight(int height) const int KButton::heightForWidth(int width) const { if (KickerSettings::showKMenuText()) { - return 30; + int recommendation = PanelPopupButton::heightForWidth(width); + if (recommendation > KickerSettings::maximumTDEMenuButtonHeight()) recommendation = KickerSettings::maximumTDEMenuButtonHeight(); + return recommendation; } else { return PanelPopupButton::heightForWidth(width); diff --git a/kicker/kicker/core/container_button.cpp b/kicker/kicker/core/container_button.cpp index fa3814bfb..a73d08abf 100644 --- a/kicker/kicker/core/container_button.cpp +++ b/kicker/kicker/core/container_button.cpp @@ -150,11 +150,16 @@ void ButtonContainer::embedButton(PanelButton* b) _button = b; _button->installEventFilter(this); - if (b->centerButtonInContainer()) { - TQVBoxLayout* vbox = new TQVBoxLayout(this); - vbox->addWidget(_button); - _layout = vbox; + TQVBoxLayout* vbox = new TQVBoxLayout(this); + if (!b->centerButtonInContainer()) { + b->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding); } + vbox->addWidget(_button, 1); + if (!b->centerButtonInContainer()) { + TQSpacerItem* spacer = new TQSpacerItem(0, 0, TQSizePolicy::Minimum, TQSizePolicy::MinimumExpanding); + vbox->addItem(spacer); + } + _layout = vbox; connect(_button, TQT_SIGNAL(requestSave()), TQT_SIGNAL(requestSave())); connect(_button, TQT_SIGNAL(hideme(bool)), TQT_SLOT(hideRequested(bool))); diff --git a/kicker/libkicker/kickerSettings.kcfg b/kicker/libkicker/kickerSettings.kcfg index 9d3b90f58..c1c4f19a5 100644 --- a/kicker/libkicker/kickerSettings.kcfg +++ b/kicker/libkicker/kickerSettings.kcfg @@ -434,6 +434,11 @@ 3 + + + 30 + + true diff --git a/libkonq/tdefileivi.cc b/libkonq/tdefileivi.cc index eb7703a83..647e9ae09 100644 --- a/libkonq/tdefileivi.cc +++ b/libkonq/tdefileivi.cc @@ -31,6 +31,7 @@ #include #include #include +#include #undef Bool @@ -175,8 +176,9 @@ bool KFileIVI::showDirectoryOverlay( ) KIVFreeSpaceOverlay* KFileIVI::setShowFreeSpaceOverlay( bool show ) { - if ( !m_fileitem->mimetype().startsWith("media/") ) + if ( !m_fileitem->mimetype().startsWith("media/") ) { return 0; + } if (show) { if (!d->m_freeSpaceOverlay) @@ -382,13 +384,31 @@ void KFileIVI::returnPressed() { if ( static_cast(iconView())->isDesktop() ) { KURL url = m_fileitem->url(); - // When clicking on a link to e.g. $HOME from the desktop, we want to open $HOME - // Symlink resolution must only happen on the desktop though (#63014) - if ( m_fileitem->isLink() && url.isLocalFile() ) - url = KURL( url, m_fileitem->linkDest() ); - - (void) new KRun( url, m_fileitem->mode(), m_fileitem->isLocalFile() ); - } else { + if (url.protocol() == "media") { + // The user reasonably expects to be placed within the media:/ tree + // when opening a media device from the desktop + KService::Ptr service = KService::serviceByDesktopName("konqueror"); + if (service) { + // HACK + // There doesn't seem to be a way to prevent KRun from resolving the URL to its + // local path, so simpy launch Konqueror with the correct arguments instead... + KRun::runCommand("konqueror " + url.url(), "konqueror", service->icon()); + } + else { + (void) new KRun( url, m_fileitem->mode(), m_fileitem->isLocalFile() ); + } + } + else { + // When clicking on a link to e.g. $HOME from the desktop, we want to open $HOME + // Symlink resolution must only happen on the desktop though (#63014) + if ( m_fileitem->isLink() && url.isLocalFile() ) { + url = KURL( url, m_fileitem->linkDest() ); + } + + (void) new KRun( url, m_fileitem->mode(), m_fileitem->isLocalFile() ); + } + } + else { m_fileitem->run(); } } diff --git a/tdeioslave/media/services/media_unmount.desktop b/tdeioslave/media/services/media_unmount.desktop index c76adf1f5..47eae4624 100644 --- a/tdeioslave/media/services/media_unmount.desktop +++ b/tdeioslave/media/services/media_unmount.desktop @@ -1,5 +1,5 @@ [Desktop Entry] -ServiceTypes=media/cdrom_mounted,media/cdrom_mounted_decrypted,media/cdwriter_mounted,media/cdwriter_mounted_decrypted,media/dvd_mounted,media/dvd_mounted_decrypted,media/floppy5_mounted,media/floppy_mounted,media/hdd_mounted,media/hdd_mounted_decrypted,media/nfs_mounted,media/smb_mounted,media/zip_mounted,media/vcd,media/svcd,media/dvdvideo +ServiceTypes=media/removable_mounted,media/removable_mounted_decrypted,media/cdrom_mounted,media/cdrom_mounted_decrypted,media/cdwriter_mounted,media/cdwriter_mounted_decrypted,media/dvd_mounted,media/dvd_mounted_decrypted,media/floppy5_mounted,media/floppy_mounted,media/hdd_mounted,media/hdd_mounted_decrypted,media/nfs_mounted,media/smb_mounted,media/zip_mounted,media/vcd,media/svcd,media/dvdvideo Actions=MediaUnmount; X-TDE-Priority=TopLevel X-TDE-MediaNotifierHide=true -- cgit v1.2.3