? kant/kwrite/Makefile.in ? kant/kwrite/Makefile Index: kcontrol/konq/rootopts.cpp =================================================================== RCS file: /home/kde/kdebase/kcontrol/konq/rootopts.cpp,v retrieving revision 1.50 diff -u -r1.50 rootopts.cpp --- kcontrol/konq/rootopts.cpp 2001/02/10 21:51:29 1.50 +++ kcontrol/konq/rootopts.cpp 2001/03/22 06:32:55 @@ -128,7 +128,23 @@ " of Macintosh. This setting is independent of the global top-level" " menu setting that applies to KDE applications.") ); +#ifdef HAVE_MNTENT_H row++; + dynamicDevicesBox = new QCheckBox(i18n("Enable Dynamic Desktop Devices"), + this); + lay->addMultiCellWidget(dynamicDevicesBox, row, row, 0, 0); + connect(dynamicDevicesBox, SIGNAL(clicked()), this, SLOT(changed())); + QWhatsThis::add(dynamicDevicesBox, + i18n("If you check this option, any" + " removable devices that you have" + " permission to mount will be" + " shown on the desktop. If you add or remove devices," + " icons will be updated accordingly.

" + "This usually includes CD-ROM drives, ZIP" + " drives, etc.")); +#endif + + row++; lay->setRowStretch( row, 10 ); previewListView = new QListView( this ); previewListView->addColumn( i18n("Show Previews for:") ); @@ -330,6 +346,9 @@ QStringList previews = g_pConfig->readListEntry("Preview"); for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it) new PreviewItem(this, previewListView, *it, previews.contains((*it)->desktopEntryName())); +#ifdef HAVE_MNTENT_H + dynamicDevicesBox->setChecked(g_pConfig->readBoolEntry("DynamicDevices", DEFAULT_DYNAMIC_DEVICES)); +#endif // g_pConfig->setGroup( "Menubar" ); bool bMenuBar = g_pConfig->readBoolEntry("ShowMenubar", false); @@ -363,6 +382,9 @@ VertAlignBox->setChecked(true); for (QListViewItem *item = previewListView->firstChild(); item; item = item->nextSibling()) static_cast(item)->setOn(false); +#ifdef HAVE_MNTENT_H + dynamicDevicesBox->setChecked(DEFAULT_DYNAMIC_DEVICES); +#endif menuBarBox->setChecked(false); leftComboBox->setCurrentItem( NOTHING ); middleComboBox->setCurrentItem( WINDOWLISTMENU ); @@ -387,6 +409,9 @@ if ( item->isOn() ) previews.append( item->pluginName() ); g_pConfig->writeEntry( "Preview", previews ); +#ifdef HAVE_MNTENT_H + g_pConfig->writeEntry( "DynamicDevices", dynamicDevicesBox->isChecked()); +#endif g_pConfig->setGroup( "Menubar" ); g_pConfig->writeEntry("ShowMenubar", menuBarBox->isChecked()); g_pConfig->setGroup( "Mouse Buttons" ); Index: kcontrol/konq/rootopts.h =================================================================== RCS file: /home/kde/kdebase/kcontrol/konq/rootopts.h,v retrieving revision 1.22 diff -u -r1.22 rootopts.h --- kcontrol/konq/rootopts.h 2001/01/09 07:18:31 1.22 +++ kcontrol/konq/rootopts.h 2001/03/22 06:32:55 @@ -53,6 +53,7 @@ QCheckBox *showHiddenBox; QCheckBox *VertAlignBox; QCheckBox *menuBarBox; + QCheckBox *dynamicDevicesBox; QListView *previewListView; // Combo for the menus Index: kdesktop/desktop.cc =================================================================== RCS file: /home/kde/kdebase/kdesktop/desktop.cc,v retrieving revision 1.217 diff -u -r1.217 desktop.cc --- kdesktop/desktop.cc 2001/02/08 10:57:58 1.217 +++ kdesktop/desktop.cc 2001/03/22 06:32:56 @@ -17,6 +17,7 @@ Boston, MA 02111-1307, USA. */ +#include #include #include @@ -25,6 +26,10 @@ #include #include +#ifdef HAVE_MNTENT_H +#include +#endif + #include #include #include @@ -68,6 +73,9 @@ #include #include #include +#include +#include +#include // root window hack #include @@ -98,6 +106,7 @@ m_bAutoStart = auto_start; m_bWaitForKded = wait_for_kded; + m_etcDirWatcher = 0L; KGlobal::locale()->insertCatalogue("kdesktop"); KGlobal::locale()->insertCatalogue("libkonq"); // needed for apps using libkonq m_language = KGlobal::locale()->language(); @@ -310,6 +319,7 @@ KDesktop::~KDesktop() { delete m_dirLister; + delete m_etcDirWatcher; delete bgMgr; delete keys; } @@ -325,6 +335,20 @@ QStringList oldPreview = m_preview; m_preview = config->readListEntry( "Preview" ); +#ifdef HAVE_MNTENT_H + m_bDynamicDevices = config->readBoolEntry("DynamicDevices", DEFAULT_DYNAMIC_DEVICES); + if (m_bDynamicDevices) { + // start watching /etc/fstab + m_etcDirWatcher = new KDirWatch(); + m_etcDirWatcher->addDir("/etc"); + connect(m_etcDirWatcher, SIGNAL(dirty(const QString &)), + SLOT(updateDynamicDevices())); + + // create dynamic device icons if necessary + updateDynamicDevices(); + } +#endif + if ( !m_bInit ) { // only when called while running - not on first startup m_dirLister->setShowingDotFiles( m_bShowDot ); keys->readSettings(); @@ -416,6 +440,152 @@ { KonqIconViewWidget::lineupIcons(); slotSaveIconPositions(); +} + +// ----------------------------------------------------------------------------- + +void KDesktop::updateDynamicDevices() +{ + kdDebug() << "KDesktop::updateDynamicDevices()" << endl; +#ifdef HAVE_MNTENT_H + static bool warnAlready = false; + static bool bFirst = true; + static QDateTime lastFstabModTime; + + if (::access("/etc/fstab", R_OK) == -1) { + kdDebug() << "Couldn't open /etc/fstab" << endl; + if (!warnAlready) { + KMessageBox::error(this, i18n("Couldn't open /etc/fstab to create dynamic devices: %1").arg(strerror(errno))); + warnAlready = true; + } + return; + } + + if (bFirst) + lastFstabModTime = QFileInfo("/etc/fstab").lastModified(); + + if (lastFstabModTime >= QFileInfo("/etc/fstab").lastModified() && !bFirst) + return; + + if (bFirst) bFirst = false; + lastFstabModTime = QFileInfo("/etc/fstab").lastModified(); + QDir desktopDir(KGlobalSettings::desktopPath()); + QStringList dList = desktopDir.entryList(QDir::Files); + + FILE *fp = setmntent("/etc/fstab", "r"); + struct mntent *mnt_ent; + +#define FS_DEVICE mnt_ent->mnt_fsname +#define FS_MNTPOINT mnt_ent->mnt_dir +#define FS_TYPE mnt_ent->mnt_type +#define FS_MNTOPTS mnt_ent->mnt_opts + + QString fileName; + // examine all partitions/devices + while ((mnt_ent = getmntent(fp)) != 0) { + // build a list of those devices we are interested in. + if (hasmntopt(mnt_ent, "owner") || + hasmntopt(mnt_ent, "user")) { + // found a user controllable device. Is it on the desktop? + bool found = false; + for (QStringList::Iterator it = dList.begin(); + it != dList.end(); ++it) { + fileName = desktopDir.absPath() + "/" + *it; + if (KMimeMagic::self()->findFileType(fileName)->mimeType() != + "application/x-desktop") + continue; + KDesktopFile devFile(fileName, true); + if (devFile.readType() != "FSDevice") + continue; + if (devFile.readEntry("Dev") == FS_DEVICE && + devFile.readEntry("MountPoint") == FS_MNTPOINT) { + found = true; + break; + } + + } + + if (!found) { + // no desktop file for this device found, create one. + fileName = desktopDir.absPath() + "/" + + QFileInfo(FS_MNTPOINT).baseName(); + KDesktopFile devFile(fileName); + devFile.writeEntry("Type", "FSDevice"); + devFile.writeEntry("Dev", FS_DEVICE); + devFile.writeEntry("MountPoint", FS_MNTPOINT); + devFile.writeEntry("FSType", FS_TYPE); + // heuristic for icon + if (strstr(FS_TYPE, "iso9660") != 0) { + devFile.writeEntry("ReadOnly", true); + } + if (strstr(FS_MNTPOINT, "cdrom") != 0) { + devFile.writeEntry("Icon", "cdrom_mount"); + devFile.writeEntry("UnmountIcon", "cdrom_unmount"); + } else if (strstr(FS_MNTPOINT, "cdwrite") != 0 || + strstr(FS_MNTPOINT, "cdrw") != 0) { + devFile.writeEntry("Icon", "cdwriter_mount"); + devFile.writeEntry("UnmountIcon", "cdwriter_unmount"); + } else if (strstr(FS_MNTPOINT, "zip") != 0) { + devFile.writeEntry("Icon", "zip_mount"); + devFile.writeEntry("UnmountIcon", "zip_unmount"); + } else if (strstr(FS_MNTPOINT, "jaz") != 0) { + devFile.writeEntry("Icon", "zip_mount"); + devFile.writeEntry("UnmountIcon", "zip_unmount"); + } else if (strstr(FS_MNTPOINT, "ls120") != 0) { + devFile.writeEntry("Icon", "3floppy_mount"); + devFile.writeEntry("UnmountIcon", "3floppy_unmount"); + } else if (strstr(FS_MNTPOINT, "camera") != 0) { + devFile.writeEntry("Icon", "memory"); + } else if (strstr(FS_MNTPOINT, "memstick") != 0) { + devFile.writeEntry("Icon", "memory"); + } else if (strstr(FS_MNTPOINT, "flash") != 0) { + devFile.writeEntry("Icon", "memory"); + } else if (strstr(FS_MNTPOINT, "floppy") != 0) { + devFile.writeEntry("Icon", "3floppy_mount"); + devFile.writeEntry("UnmountIcon", "3floppy_unmount"); + } else { + // catch all + devFile.writeEntry("Icon", "hdd_mount"); + devFile.writeEntry("UnmountIcon", "hdd_unmount"); + } + + devFile.writeEntry("X-KDE-Dynamic-Device", true); + devFile.sync(); // write + kdDebug() << "Created device icon " << fileName << endl; + } /* !found */ + + } /* owner/user mount opt */ + } /* fstab iterator */ + endmntent(fp); + + // now go through all desktop devices and remove any that may + // have disappeared. Opposite of above. + dList = desktopDir.entryList(QDir::Files); + for (QStringList::Iterator it = dList.begin(); + it != dList.end(); ++it) { + fileName = desktopDir.absPath() + "/" + *it; + KDesktopFile devFile(fileName, true); + bool found = false; + fp = setmntent("/etc/fstab", "r"); // already checked, we can access + + while ((mnt_ent = getmntent(fp)) != 0) { + if (devFile.readEntry("Dev") == FS_DEVICE && + devFile.readEntry("MountPoint") == FS_MNTPOINT) { + found = true; + break; + } + } /* fstab iterator */ + endmntent(fp); + + if (!found && devFile.readBoolEntry("X-KDE-Dynamic-Device", false)) { + desktopDir.remove(*it); + kdDebug() << "Removed device icon " << fileName << endl; + } + + } /* dir iterator */ +#else + kdDebug() << "This OS does not support dynamic devices" << endl; +#endif } // ----------------------------------------------------------------------------- Index: kdesktop/desktop.h =================================================================== RCS file: /home/kde/kdebase/kdesktop/desktop.h,v retrieving revision 1.101 diff -u -r1.101 desktop.h --- kdesktop/desktop.h 2001/02/08 10:57:58 1.101 +++ kdesktop/desktop.h 2001/03/22 06:32:56 @@ -32,6 +32,7 @@ class KonqDirLister; class KonqSettings; +class KDirWatch; class QCloseEvent; class QDropEvent; class QPopupMenu; @@ -179,6 +180,9 @@ // set the vroot atom for e.g. xsnow void setVRoot(); + // called if dynamic device icons enabled + void updateDynamicDevices(); + public slots: // for krootwm void slotPaste(); @@ -222,6 +226,9 @@ /** Vertical or Horizontal align of icons on desktop */ uint m_bVertAlign:1; + /** Dynamically generate desktop removable desktop devices from /etc/fstab */ + uint m_bDynamicDevices:1; + QIconView::Arrangement m_tAlign; /** Settings - see libkonq/konqsettings.* */ @@ -230,6 +237,9 @@ /** The directory lister for this URL */ KonqDirLister* m_dirLister; + /** If dynamic device icons enabled, this will be used to watch /etc/fstab */ + KDirWatch *m_etcDirWatcher; + KGlobalAccel *keys; KAccel *m_accel; Index: libkonq/konq_defaults.h =================================================================== RCS file: /home/kde/kdebase/libkonq/konq_defaults.h,v retrieving revision 1.21 diff -u -r1.21 konq_defaults.h --- libkonq/konq_defaults.h 2000/12/02 18:24:41 1.21 +++ libkonq/konq_defaults.h 2001/03/22 06:32:56 @@ -69,3 +69,4 @@ #define DEFAULT_DESKTOP_IMAGEPREVIEW false #define DEFAULT_DESKTOP_TEXTPREVIEW false +#define DEFAULT_DYNAMIC_DEVICES true