Package: korganizer Version: 4:4.14.1-1nograb Severity: important Tags: patch upstream
Dear Maintainer, *** Reporter, please consider answering these questions, where appropriate *** * What led up to the situation? * What exactly did you do (or not do) that was effective (or ineffective)? * What was the outcome of this action? * What outcome did you expect instead? *** End of the template - remove these template lines *** While it can make it easier to dismiss (if it grabs focus through the activateWindow call), it also means if you are typing and a reminder comes in it will both get those keystrokes and a space or return will dismiss the reminder before you have a chance to ever see what the reminder was about, which assumes you are even looking at your screen to see the reminder box flash up, if you are typing from paper you might not even know. This patch will call raiseWindow instead of activateWindow, but adds a dock menu item to grab focus if someone actually wants that behavior. While I was add it I added a dock menu item to show the reminder window, which was useful in debugging, and lets you get at items that have been suspended, alloing to view or dismiss them. This might satisfy "Bug 302865 - Inaccessible reminders" There is a code comment "Try to keep the dialog small and non-obtrusive." I've made it smaller by default, and set the minimum size even smaller than reasonable, but this is better than the previous which wouldn't let you size it smaller than the default. I added more points to save the position and improve the logic, now it will save and restore the position and size, and then show the window so it will no longer jump. Patch is against Debian 4.14.1 source tree. The korgac in the previous Debian release, 4.4.11 does not grab the keyboard when the notification dialog appears. Reproducible: Always Steps to Reproduce: 1. set korganizer reminder 2. start typing a paragraph 3. continue typing as the notification goes off Actual Results: watch korgac reminder appear grab keyboard focus and vanish at the next space, depending on the timing you have no chance to stop typing before it is gone Expected Results: The notifier window to appear at the last location it was dismissed at and only get focus when the window manager directs focus to it. I'm flagging the severity at important, because it was so disruptive I had stopped using it until I fixed it. >From bb8f84deeefaaf74bc285fc2534111a78a5f12ff Mon Sep 17 00:00:00 2001 From: David Fries <da...@fries.net> Date: Sat, 9 May 2015 10:48:10 -0500 Subject: [PATCH 1/5] add an option to not grab keyboard focus when a reminder is displayed While it can make it easier to dismiss (if it grabs focus through the activateWindow call), it also means if you are typing and a reminder comes in it will both get those keystrokes and a space or return will dismiss the reminder before you have a chance to ever see what the reminder was about, which assumes you are even looking at your screen to see the reminder box flash up, if you are typing in a paper you might not even know. --- korgac/alarmdialog.cpp | 12 +++++++++++- korgac/alarmdialog.h | 1 + korgac/alarmdockwindow.cpp | 15 +++++++++++++++ korgac/alarmdockwindow.h | 7 +++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/korgac/alarmdialog.cpp b/korgac/alarmdialog.cpp index 6bbd867..59c5790 100644 --- a/korgac/alarmdialog.cpp +++ b/korgac/alarmdialog.cpp @@ -567,7 +567,11 @@ void AlarmDialog::show() KWindowSystem::unminimizeWindow( winId(), false ); KWindowSystem::setState( winId(), NET::KeepAbove | NET::DemandsAttention ); KWindowSystem::setOnAllDesktops( winId(), true ); - KWindowSystem::activateWindow( winId() ); + if ( grabFocus( ) ) { + KWindowSystem::activateWindow( winId() ); + } else { + KWindowSystem::raiseWindow( winId() ); + } // Audio, Procedure, and EMail alarms eventNotification(); @@ -1036,3 +1040,9 @@ void AlarmDialog::removeFromConfig( const QList<Akonadi::Item::Id> &ids ) genGroup.sync(); } +bool AlarmDialog::grabFocus( ) +{ + KSharedConfig::Ptr config = KGlobal::config(); + KConfigGroup generalConfig( config, "General" ); + return generalConfig.readEntry( "GrabFocus", false ); +} diff --git a/korgac/alarmdialog.h b/korgac/alarmdialog.h index 41acee6..8f298d4 100644 --- a/korgac/alarmdialog.h +++ b/korgac/alarmdialog.h @@ -123,6 +123,7 @@ class AlarmDialog : public KDialog void updateButtons(); void toggleDetails( QTreeWidgetItem *item ); void showDetails( QTreeWidgetItem *item ); + static bool grabFocus( ); Akonadi::ETMCalendar::Ptr mCalendar; QTreeWidget *mIncidenceTree; diff --git a/korgac/alarmdockwindow.cpp b/korgac/alarmdockwindow.cpp index 35343be..8fe6ecf 100644 --- a/korgac/alarmdockwindow.cpp +++ b/korgac/alarmdockwindow.cpp @@ -45,6 +45,7 @@ AlarmDockWindow::AlarmDockWindow() KConfigGroup config( KGlobal::config(), "General" ); bool autostartSet = config.hasKey( "Autostart" ); bool autostart = config.readEntry( "Autostart", true ); + bool grabfocus = config.readEntry( "GrabFocus", false ); bool alarmsEnabled = config.readEntry( "Enabled", true ); mName = i18nc( "@title:window", "KOrganizer Reminder Daemon" ); @@ -90,6 +91,12 @@ AlarmDockWindow::AlarmDockWindow() connect( mAutostart, SIGNAL(toggled(bool)), SLOT(toggleAutostart(bool)) ); mAutostart->setCheckable( true ); + mGrabFocus = + contextMenu()->addAction( i18nc( "@action:inmenu", "Reminder grabs focus" ) ); + connect( mGrabFocus, SIGNAL(toggled(bool)), SLOT(toggleGrabFocus(bool)) ); + mGrabFocus->setCheckable( true ); + mGrabFocus->setChecked( grabfocus ); + mAlarmsEnabled->setChecked( alarmsEnabled ); mAutostart->setChecked( autostart ); @@ -142,6 +149,14 @@ void AlarmDockWindow::toggleAutostart( bool checked ) enableAutostart( checked ); } +void AlarmDockWindow::toggleGrabFocus( bool checked ) +{ + kDebug(); + KConfigGroup config( KGlobal::config(), "General" ); + config.writeEntry( "GrabFocus", checked ); + config.sync(); +} + void AlarmDockWindow::slotSuspendAll() { emit suspendAllSignal(); diff --git a/korgac/alarmdockwindow.h b/korgac/alarmdockwindow.h index 68300cc..0ebb977 100644 --- a/korgac/alarmdockwindow.h +++ b/korgac/alarmdockwindow.h @@ -42,6 +42,7 @@ class AlarmDockWindow : public KStatusNotifierItem public slots: void toggleAlarmsEnabled( bool checked ); void toggleAutostart( bool checked ); + void toggleGrabFocus( bool checked ); void slotUpdate( int reminders ); signals: @@ -63,6 +64,12 @@ class AlarmDockWindow : public KStatusNotifierItem QAction *mAlarmsEnabled; QAction *mAutostart; + // True/Enable if the notify daemon should grab focus (activate window) away + // from the current application. This makes it easy to dismiss, but there's + // a good chance if the user is typing there's a good chance they will loose + // keys and dismiss the notification without having a chance to see what + // the notification was about. + QAction *mGrabFocus; QAction *mSuspendAll; QAction *mDismissAll; -- 2.1.4 >From dd71d4b86debc129ca429fdf2e0b1fa2bf0148c0 Mon Sep 17 00:00:00 2001 From: David Fries <da...@fries.net> Date: Sat, 9 May 2015 12:11:18 -0500 Subject: [PATCH 2/5] Add a menu option to always get to the reminder dialog. Otherwise once a notice is suspended you can't get to it again until it goes off, this way you can. There is still an interaction problem in the dialog since the entries are disabled and being able to select them, but the current item can be dismissed and all can be dismissed. --- korgac/alarmdockwindow.cpp | 5 +++++ korgac/alarmdockwindow.h | 2 ++ korgac/koalarmclient.cpp | 34 ++++++++++++++++++++++++---------- korgac/koalarmclient.h | 5 +++-- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/korgac/alarmdockwindow.cpp b/korgac/alarmdockwindow.cpp index 8fe6ecf..658c068 100644 --- a/korgac/alarmdockwindow.cpp +++ b/korgac/alarmdockwindow.cpp @@ -77,8 +77,13 @@ AlarmDockWindow::AlarmDockWindow() mDismissAll = contextMenu()->addAction( i18nc( "@action:inmenu", "Dismiss All Reminders" ), this, SLOT(slotDismissAll()) ); + mShow = + contextMenu()->addAction( i18nc( "@action:inmenu", "Show Reminders" ), this, + SIGNAL(showReminderSignal()) ); mSuspendAll->setEnabled( false ); mDismissAll->setEnabled( false ); + // leave mShow always enabled that way you can get to alarms that are + // suspended and inactive to dismiss them before they go off again contextMenu()->addSeparator(); mAlarmsEnabled = diff --git a/korgac/alarmdockwindow.h b/korgac/alarmdockwindow.h index 0ebb977..bf79864 100644 --- a/korgac/alarmdockwindow.h +++ b/korgac/alarmdockwindow.h @@ -49,6 +49,7 @@ class AlarmDockWindow : public KStatusNotifierItem void quitSignal(); void suspendAllSignal(); void dismissAllSignal(); + void showReminderSignal(); protected slots: virtual void activate( const QPoint &pos ); @@ -72,6 +73,7 @@ class AlarmDockWindow : public KStatusNotifierItem QAction *mGrabFocus; QAction *mSuspendAll; QAction *mDismissAll; + QAction *mShow; bool mAutostartSet; }; diff --git a/korgac/koalarmclient.cpp b/korgac/koalarmclient.cpp index 22f2746..733b945 100644 --- a/korgac/koalarmclient.cpp +++ b/korgac/koalarmclient.cpp @@ -69,6 +69,7 @@ KOAlarmClient::KOAlarmClient( QObject *parent ) mDocker = new AlarmDockWindow; connect( this, SIGNAL(reminderCount(int)), mDocker, SLOT(slotUpdate(int)) ); connect( mDocker, SIGNAL(quitSignal()), SLOT(slotQuit()) ); + connect( mDocker, SIGNAL(showReminderSignal()), this, SLOT(showReminder()) ); } #endif QStringList mimeTypes; @@ -145,7 +146,7 @@ void KOAlarmClient::deferredInit() const QDateTime dt = incGroup.readEntry( "RemindAt", QDateTime() ); Akonadi::Item i = mCalendar->item( Akonadi::Item::fromUrl( url ).id() ); if ( CalendarSupport::hasIncidence( i ) && !CalendarSupport::incidence( i )->alarms().isEmpty() ) { - createReminder( mCalendar, i, dt, QString() ); + createReminder( i, dt, QString() ); } } } @@ -215,22 +216,23 @@ void KOAlarmClient::checkAlarms() const Akonadi::Item::Id id = mCalendar->item( uid ).id(); const Akonadi::Item item = mCalendar->item( id ); - createReminder( mCalendar, item, from, alarm->text() ); + createReminder( item, from, alarm->text() ); } } -void KOAlarmClient::createReminder( const Akonadi::ETMCalendar::Ptr &calendar, - const Akonadi::Item &aitem, - const QDateTime &remindAtDate, - const QString &displayText ) +void KOAlarmClient::showReminder() { - if ( !CalendarSupport::hasIncidence( aitem ) ) { - return; + allocateDialog(); + if ( mDialog ) { + mDialog->show(); } +} +void KOAlarmClient::allocateDialog() +{ #if !defined(Q_WS_MAEMO_5) && !defined(KORGAC_AKONADI_AGENT) if ( !mDialog ) { - mDialog = new AlarmDialog( calendar ); + mDialog = new AlarmDialog( mCalendar ); connect( this, SIGNAL(saveAllSignal()), mDialog, SLOT(slotSave()) ); if ( mDocker ) { connect( mDialog, SIGNAL(reminderCount(int)), @@ -241,12 +243,24 @@ void KOAlarmClient::createReminder( const Akonadi::ETMCalendar::Ptr &calendar, mDialog, SLOT(dismissAll()) ); } } +#endif +} + +void KOAlarmClient::createReminder( const Akonadi::Item &aitem, + const QDateTime &remindAtDate, + const QString &displayText ) +{ + if ( !CalendarSupport::hasIncidence( aitem ) ) { + return; + } + +#if !defined(Q_WS_MAEMO_5) && !defined(KORGAC_AKONADI_AGENT) + allocateDialog(); mDialog->addIncidence( aitem, remindAtDate, displayText ); mDialog->wakeUp(); #else const Incidence::Ptr incidence = CalendarSupport::incidence( aitem ); - Q_UNUSED( calendar ); Q_UNUSED( remindAtDate ); Q_UNUSED( displayText ); diff --git a/korgac/koalarmclient.h b/korgac/koalarmclient.h index bc9c433..80cf8d4 100644 --- a/korgac/koalarmclient.h +++ b/korgac/koalarmclient.h @@ -64,6 +64,7 @@ class KOAlarmClient : public QObject, public KSessionManager protected slots: void deferredInit(); void checkAlarms(); + void showReminder(); signals: void reminderCount( int ); @@ -72,10 +73,10 @@ class KOAlarmClient : public QObject, public KSessionManager private: bool dockerEnabled(); bool collectionsAvailable() const; - void createReminder( const Akonadi::ETMCalendar::Ptr &calendar, - const Akonadi::Item &incidence, + void createReminder( const Akonadi::Item &incidence, const QDateTime &dt, const QString &displayText ); void saveLastCheckTime(); + void allocateDialog(); AlarmDockWindow *mDocker; // the panel icon Akonadi::ETMCalendar::Ptr mCalendar; -- 2.1.4 >From d7830ba34a9c568ed4d84eb332023b7a0efb8c7c Mon Sep 17 00:00:00 2001 From: David Fries <da...@fries.net> Date: Sat, 9 May 2015 12:26:24 -0500 Subject: [PATCH 3/5] make the dialog even smaller The existing comment was // Try to keep the dialog small and non-obtrusive. but it prevented the user form making it even smaller. This is a set of changes to make it smaller. --- korgac/alarmdialog.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/korgac/alarmdialog.cpp b/korgac/alarmdialog.cpp index 59c5790..c765d98 100644 --- a/korgac/alarmdialog.cpp +++ b/korgac/alarmdialog.cpp @@ -180,18 +180,27 @@ AlarmDialog::AlarmDialog( const Akonadi::ETMCalendar::Ptr &calendar, QWidget *pa "Suspend the reminders for the selected incidences " "by the specified interval" ) ); - // Try to keep the dialog small and non-obtrusive. - setMinimumWidth( 575 ); - setMinimumHeight( 300 ); + QVBoxLayout *topLayout = new QVBoxLayout( topBox ); - QVBoxLayout *mTopLayout = new QVBoxLayout( topBox ); + // Try to keep the dialog small and non-obtrusive. + // let the user resize smaller + setMinimumWidth( 280 ); + setMinimumHeight( 160 ); + // a more useful default size + resize( QSize( 424, 187 ) ); + // take out some padding which makes it larger + topLayout->setSpacing( 2 ); + setStyleSheet( QLatin1String( "* { margin: 0px; padding: 0px; }" ) ); + QMargins margins( 0, 0, 0, 0 ); + topLayout->setContentsMargins( margins ); + setContentsMargins( margins ); QLabel *label = new QLabel( i18nc( "@label", "Reminders: " - "Click on a title to toggle the details viewer for that item" ), + "Clicking on the title toggles details for item" ), topBox ); - mTopLayout->addWidget( label ); + topLayout->addWidget( label ); mIncidenceTree = new ReminderTree( topBox ); mIncidenceTree->setColumnCount( 3 ); @@ -216,7 +225,7 @@ AlarmDialog::AlarmDialog( const Akonadi::ETMCalendar::Ptr &calendar, QWidget *pa mIncidenceTree->setSelectionMode( QAbstractItemView::ExtendedSelection ); mIncidenceTree->setRootIsDecorated( false ); - mTopLayout->addWidget( mIncidenceTree ); + topLayout->addWidget( mIncidenceTree ); connect( mIncidenceTree, SIGNAL(itemActivated(QTreeWidgetItem*,int)), SLOT(update()) ); @@ -230,13 +239,13 @@ AlarmDialog::AlarmDialog( const Akonadi::ETMCalendar::Ptr &calendar, QWidget *pa "<emphasis>Select an event or to-do from the list above " "to view its details here.</emphasis>" ); mDetailView->setDefaultMessage( s ); - mTopLayout->addWidget( mDetailView ); + topLayout->addWidget( mDetailView ); mDetailView->hide(); mLastItem = 0; KHBox *suspendBox = new KHBox( topBox ); suspendBox->setSpacing( spacingHint() ); - mTopLayout->addWidget( suspendBox ); + topLayout->addWidget( suspendBox ); QLabel *l = new QLabel( i18nc( "@label:spinbox", "Suspend &duration:" ), suspendBox ); -- 2.1.4 >From 31544816fc4c512106d2420111356f8f900270de Mon Sep 17 00:00:00 2001 From: David Fries <da...@fries.net> Date: Sat, 9 May 2015 13:08:42 -0500 Subject: [PATCH 4/5] save size and position on dialog hide/close and improve restore Instead of saving position some times (application close, suspend reminder), save at each point the dialog hides, dismiss reminder, dismiss all, escape or window close, etc. In addition to saving the position, save the geometry to get the size as well, that way if the user wants it bigger (or smaller) the only have to do it once. The logic was show, move, which would run in that order, the window shows, then it moves to the correct location which looks bad, restore the position & size, then show, so it appears in the final location. --- korgac/alarmdialog.cpp | 28 ++++++++++++++++++---------- korgac/alarmdialog.h | 3 ++- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/korgac/alarmdialog.cpp b/korgac/alarmdialog.cpp index c765d98..bd88f8f 100644 --- a/korgac/alarmdialog.cpp +++ b/korgac/alarmdialog.cpp @@ -154,13 +154,12 @@ AlarmDialog::AlarmDialog( const Akonadi::ETMCalendar::Ptr &calendar, QWidget *pa KSharedConfig::Ptr config = KGlobal::config(); KConfigGroup generalConfig( config, "General" ); - QPoint pos = generalConfig.readEntry( "Position", QPoint( 0, 0 ) ); + mRect = generalConfig.readEntry( "Position", QRect() ); + if ( !mRect.isNull() ) { + setGeometry( mRect ); + } QWidget *topBox = new QWidget( this ); - if ( !pos.isNull() ) { - mPos = pos; - topBox->move( mPos ); - } setMainWidget( topBox ); setCaption( i18nc( "@title:window", "Reminders" ) ); setWindowIcon( KIcon( QLatin1String("korgac") ) ); @@ -569,10 +568,11 @@ void AlarmDialog::show() // mSuspendSpin->setValue( defSuspendVal ); // mSuspendUnit->setCurrentIndex( defSuspendUnit ); - KDialog::show(); - if ( !mPos.isNull() ) { - KDialog::move( mPos ); + // move then show so it appears at the right place (not the other way around) + if ( !mRect.isNull() ) { + setGeometry( mRect ); } + KDialog::show(); KWindowSystem::unminimizeWindow( winId(), false ); KWindowSystem::setState( winId(), NET::KeepAbove | NET::DemandsAttention ); KWindowSystem::setOnAllDesktops( winId(), true ); @@ -751,7 +751,8 @@ void AlarmDialog::slotSave() } generalConfig.writeEntry( "Reminders", numReminders ); - generalConfig.writeEntry( "Position", pos() ); + mRect = geometry(); + generalConfig.writeEntry( "Position", mRect ); config->sync(); } @@ -785,10 +786,17 @@ int AlarmDialog::activeCount() void AlarmDialog::closeEvent( QCloseEvent * ) { + // application close not window hide slotSave(); accept(); } +void AlarmDialog::reject ( ) +{ + slotSave(); + KDialog::reject( ); +} + void AlarmDialog::updateButtons() { const int count = selectedItems().count(); @@ -867,7 +875,7 @@ void AlarmDialog::popupItemMenu( const QPoint &point ) void AlarmDialog::accept() { if ( activeCount() == 0 ) { - mPos = pos(); + slotSave(); hide(); } } diff --git a/korgac/alarmdialog.h b/korgac/alarmdialog.h index 8f298d4..124ca5c 100644 --- a/korgac/alarmdialog.h +++ b/korgac/alarmdialog.h @@ -99,6 +99,7 @@ class AlarmDialog : public KDialog protected: void keyPressEvent( QKeyEvent *e ); void closeEvent( QCloseEvent * ); + void reject ( ); private: static KDateTime triggerDateForIncidence( const KCalCore::Incidence::Ptr &inc, @@ -130,7 +131,7 @@ class AlarmDialog : public KDialog CalendarSupport::IncidenceViewer *mDetailView; KPIMIdentities::IdentityManager *mIdentityManager; - QPoint mPos; + QRect mRect; QSpinBox *mSuspendSpin; KComboBox *mSuspendUnit; QTimer mSuspendTimer; -- 2.1.4 >From f4d5f482d66f9bbc14ed6bd164b2abffcfb20d44 Mon Sep 17 00:00:00 2001 From: David Fries <da...@fries.net> Date: Sat, 9 May 2015 13:23:25 -0500 Subject: [PATCH 5/5] 4:4.14.1-1nograb changelog for focus, size, changes --- debian/changelog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index f97b712..1e7ab4f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +kdepim (4:4.14.1-1nograb) unstable; urgency=medium + + * don't grab the keyboard focus by default, add as an option + * add dock option to get to reminder dialog for suspended events to + view/dismiss + * make reminder dialog smaller + * save reminder dialog size in addition to position, save at each dialog hide, + improve restore + + -- David Fries <da...@fries.net> Sat, 09 May 2015 13:23:19 -0500 + kdepim (4:4.14.1-1) unstable; urgency=medium * Remove old Breaks/Replaces (for versions older than oldstable). -- 2.1.4 -- System Information: Debian Release: 8.0 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 4.0.0-rc7+ (SMP w/4 CPU cores) Locale: LANG=C, LC_CTYPE=en_US.ISO-8859-15 (charmap=ISO-8859-15) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) Versions of packages korganizer depends on: ii kde-runtime 4:4.14.2-2 ii kdepim-runtime 4:4.14.2-3 ii kdepimlibs-kio-plugins 4:4.14.2-2+b1 ii libakonadi-calendar4 4:4.14.2-2+b1 ii libakonadi-contact4 4:4.14.2-2+b1 ii libakonadi-kde4 4:4.14.2-2+b1 ii libakonadi-kmime4 4:4.14.2-2+b1 ii libc6 2.19-18 ii libcalendarsupport4 4:4.14.1-1nograb ii libeventviews4 4:4.14.1-1nograb ii libgcc1 1:4.9.2-10 ii libincidenceeditorsng4 4:4.14.1-1nograb ii libkabc4 4:4.14.2-2+b1 ii libkcalcore4 4:4.14.2-2+b1 ii libkcalutils4 4:4.14.2-2+b1 ii libkcmutils4 4:4.14.2-5 ii libkdecore5 4:4.14.2-5 ii libkdepim4 4:4.14.1-1nograb ii libkdepimdbusinterfaces4 4:4.14.1-1nograb ii libkdeui5 4:4.14.2-5 ii libkholidays4 4:4.14.2-2+b1 ii libkio5 4:4.14.2-5 ii libkmime4 4:4.14.2-2+b1 ii libknewstuff3-4 4:4.14.2-5 ii libkontactinterface4a 4:4.14.2-2+b1 ii libkparts4 4:4.14.2-5 ii libkpimidentities4 4:4.14.2-2+b1 ii libkpimutils4 4:4.14.2-2+b1 ii libmailtransport4 4:4.14.2-2+b1 ii libphonon4 4:4.8.0-4 ii libpimcommon4 4:4.14.1-1nograb ii libqt4-dbus 4:4.8.6+git64-g5dc8b2b+dfsg-3 ii libqt4-xml 4:4.8.6+git64-g5dc8b2b+dfsg-3 ii libqtcore4 4:4.8.6+git64-g5dc8b2b+dfsg-3 ii libqtgui4 4:4.8.6+git64-g5dc8b2b+dfsg-3 ii libstdc++6 4.9.2-10 ii perl 5.20.2-3 ii phonon 4:4.8.0-4 Versions of packages korganizer recommends: ii kdepim-kresources 4:4.14.1-1nograb korganizer suggests no packages. -- no debconf information -- To UNSUBSCRIBE, email to debian-qt-kde-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: https://lists.debian.org/20150509201144.31468.59545.report...@spacedout.fries.net