summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2018-11-07 21:46:15 +0100
committerMilan Crha <mcrha@redhat.com>2018-11-07 21:46:15 +0100
commitc559c57c38b1a26043cd5795eebd80c35ebf2ed2 (patch)
tree0107c381901e52b1e9d73b6c2a8056440fa7acab
parent36b07dd5de1ea586b566b8ee8e6bb43eb93403b5 (diff)
downloadevolution-data-server-c559c57c38b1a26043cd5795eebd80c35ebf2ed2.tar.gz
evo-I#113 - Make 'Mark messages as read' a folder/account option
Related to https://gitlab.gnome.org/GNOME/evolution/issues/113
-rw-r--r--docs/reference/camel/camel-docs.sgml.in4
-rw-r--r--src/camel/camel-folder.c160
-rw-r--r--src/camel/camel-folder.h8
-rw-r--r--src/camel/camel-object.c16
-rw-r--r--src/libedataserver/e-source-mail-account.c146
-rw-r--r--src/libedataserver/e-source-mail-account.h11
6 files changed, 343 insertions, 2 deletions
diff --git a/docs/reference/camel/camel-docs.sgml.in b/docs/reference/camel/camel-docs.sgml.in
index 2e66b6d4a..717b5606d 100644
--- a/docs/reference/camel/camel-docs.sgml.in
+++ b/docs/reference/camel/camel-docs.sgml.in
@@ -297,6 +297,10 @@
<title>Index of deprecated symbols</title>
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
</index>
+ <index id="api-index-3-32" role="3.32">
+ <title>Index of new symbols in 3.32</title>
+ <xi:include href="xml/api-index-3.32.xml"><xi:fallback /></xi:include>
+ </index>
<index id="api-index-3-30" role="3.30">
<title>Index of new symbols in 3.30</title>
<xi:include href="xml/api-index-3.30.xml"><xi:fallback /></xi:include>
diff --git a/src/camel/camel-folder.c b/src/camel/camel-folder.c
index 9c21e5940..abece0c9f 100644
--- a/src/camel/camel-folder.c
+++ b/src/camel/camel-folder.c
@@ -26,6 +26,7 @@
#include "camel-db.h"
#include "camel-debug.h"
+#include "camel-enumtypes.h"
#include "camel-filter-driver.h"
#include "camel-folder.h"
#include "camel-mempool.h"
@@ -70,6 +71,9 @@ struct _CamelFolderPrivate {
gchar *full_name;
gchar *display_name;
gchar *description;
+
+ CamelThreeState mark_seen;
+ gint mark_seen_timeout;
};
struct _AsyncContext {
@@ -112,7 +116,9 @@ enum {
PROP_DESCRIPTION,
PROP_DISPLAY_NAME,
PROP_FULL_NAME,
- PROP_PARENT_STORE
+ PROP_PARENT_STORE,
+ PROP_MARK_SEEN,
+ PROP_MARK_SEEN_TIMEOUT
};
enum {
@@ -587,6 +593,18 @@ folder_set_property (GObject *object,
CAMEL_FOLDER (object),
g_value_get_object (value));
return;
+
+ case PROP_MARK_SEEN:
+ camel_folder_set_mark_seen (
+ CAMEL_FOLDER (object),
+ g_value_get_enum (value));
+ return;
+
+ case PROP_MARK_SEEN_TIMEOUT:
+ camel_folder_set_mark_seen_timeout (
+ CAMEL_FOLDER (object),
+ g_value_get_int (value));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -622,6 +640,18 @@ folder_get_property (GObject *object,
value, camel_folder_get_parent_store (
CAMEL_FOLDER (object)));
return;
+
+ case PROP_MARK_SEEN:
+ g_value_set_enum (
+ value, camel_folder_get_mark_seen (
+ CAMEL_FOLDER (object)));
+ return;
+
+ case PROP_MARK_SEEN_TIMEOUT:
+ g_value_set_int (
+ value, camel_folder_get_mark_seen_timeout (
+ CAMEL_FOLDER (object)));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1275,6 +1305,50 @@ camel_folder_class_init (CamelFolderClass *class)
G_PARAM_CONSTRUCT_ONLY));
/**
+ * CamelFolder:mark-seen
+ *
+ * A #CamelThreeState persistent option of the folder,
+ * which can override global option to mark messages
+ * as seen after certain interval.
+ *
+ * Since: 3.32
+ **/
+ g_object_class_install_property (
+ object_class,
+ PROP_MARK_SEEN,
+ g_param_spec_enum (
+ "mark-seen",
+ "Mark Seen",
+ "Mark messages as read after N seconds",
+ CAMEL_TYPE_THREE_STATE,
+ CAMEL_THREE_STATE_INCONSISTENT,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_EXPLICIT_NOTIFY |
+ CAMEL_PARAM_PERSISTENT));
+
+ /**
+ * CamelFolder:mark-seen-timeout
+ *
+ * Timeout in milliseconds for marking messages as seen.
+ *
+ * Since: 3.32
+ **/
+ g_object_class_install_property (
+ object_class,
+ PROP_MARK_SEEN_TIMEOUT,
+ g_param_spec_int (
+ "mark-seen-timeout",
+ "Mark Seen Timeout",
+ "Mark seen timeout",
+ 0, G_MAXINT32,
+ 1500,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_EXPLICIT_NOTIFY |
+ CAMEL_PARAM_PERSISTENT));
+
+ /**
* CamelFolder::changed
* @folder: the #CamelFolder which emitted the signal
* @changes: the #CamelFolderChangeInfo with the list of changes
@@ -1766,6 +1840,90 @@ camel_folder_set_flags (CamelFolder *folder,
}
/**
+ * camel_folder_get_mark_seen:
+ * @folder: a #CamelFolder
+ *
+ * Returns: a #CamelThreeState, whether messages in this @folder
+ * should be marked as seen automatically.
+ *
+ * Since: 3.32
+ **/
+CamelThreeState
+camel_folder_get_mark_seen (CamelFolder *folder)
+{
+ g_return_val_if_fail (CAMEL_IS_FOLDER (folder), CAMEL_THREE_STATE_INCONSISTENT);
+
+ return folder->priv->mark_seen;
+}
+
+/**
+ * camel_folder_set_mark_seen:
+ * @folder: a #CamelFolder
+ * @mark_seen: a #CamelThreeState as the value to set
+ *
+ * Sets whether the messages in this @folder should be marked
+ * as seen automatically. An inconsistent state means to use
+ * global option.
+ *
+ * Since: 3.32
+ **/
+void
+camel_folder_set_mark_seen (CamelFolder *folder,
+ CamelThreeState mark_seen)
+{
+ g_return_if_fail (CAMEL_IS_FOLDER (folder));
+
+ if (folder->priv->mark_seen == mark_seen)
+ return;
+
+ folder->priv->mark_seen = mark_seen;
+
+ g_object_notify (G_OBJECT (folder), "mark-seen");
+}
+
+/**
+ * camel_folder_get_mark_seen_timeout:
+ * @folder: a #CamelFolder
+ *
+ * Returns: timeout in milliseconds for marking messages
+ * as seen in this @folder
+ *
+ * Since: 3.32
+ **/
+gint
+camel_folder_get_mark_seen_timeout (CamelFolder *folder)
+{
+ g_return_val_if_fail (CAMEL_IS_FOLDER (folder), -1);
+
+ return folder->priv->mark_seen_timeout;
+}
+
+/**
+ * camel_folder_set_mark_seen_timeout:
+ * @folder: a #CamelFolder
+ * @timeout: a timeout in milliseconds
+ *
+ * Sets the @timeout in milliseconds for marking messages
+ * as seen in this @folder. Whether the timeout is used
+ * depends on camel_folder_get_mark_seen().
+ *
+ * Since: 3.32
+ **/
+void
+camel_folder_set_mark_seen_timeout (CamelFolder *folder,
+ gint timeout)
+{
+ g_return_if_fail (CAMEL_IS_FOLDER (folder));
+
+ if (folder->priv->mark_seen_timeout == timeout)
+ return;
+
+ folder->priv->mark_seen_timeout = timeout;
+
+ g_object_notify (G_OBJECT (folder), "mark-seen-timeout");
+}
+
+/**
* camel_folder_get_permanent_flags:
* @folder: a #CamelFolder
*
diff --git a/src/camel/camel-folder.h b/src/camel/camel-folder.h
index a20e183cf..ea5b80c44 100644
--- a/src/camel/camel-folder.h
+++ b/src/camel/camel-folder.h
@@ -301,6 +301,14 @@ void camel_folder_set_description (CamelFolder *folder,
guint32 camel_folder_get_flags (CamelFolder *folder);
void camel_folder_set_flags (CamelFolder *folder,
guint32 folder_flags);
+CamelThreeState camel_folder_get_mark_seen (CamelFolder *folder);
+void camel_folder_set_mark_seen (CamelFolder *folder,
+ CamelThreeState mark_seen);
+gint camel_folder_get_mark_seen_timeout
+ (CamelFolder *folder);
+void camel_folder_set_mark_seen_timeout
+ (CamelFolder *folder,
+ gint timeout);
guint32 camel_folder_get_permanent_flags
(CamelFolder *folder);
#ifndef CAMEL_DISABLE_DEPRECATED
diff --git a/src/camel/camel-object.c b/src/camel/camel-object.c
index 807c9acc5..6dbae762f 100644
--- a/src/camel/camel-object.c
+++ b/src/camel/camel-object.c
@@ -200,6 +200,7 @@ object_state_read (CamelObject *object,
for (ii = 0; ii < count; ii++) {
gboolean property_set = FALSE;
guint32 tag, v_uint32;
+ gint32 v_int32;
if (camel_file_util_decode_uint32 (fp, &tag) == -1)
goto exit;
@@ -213,6 +214,12 @@ object_state_read (CamelObject *object,
g_value_init (&value, G_TYPE_BOOLEAN);
g_value_set_boolean (&value, (gboolean) v_uint32);
break;
+ case CAMEL_ARG_INT:
+ if (camel_file_util_decode_fixed_int32 (fp, &v_int32) == -1)
+ goto exit;
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, v_int32);
+ break;
case CAMEL_ARG_3ST:
if (camel_file_util_decode_uint32 (fp, &v_uint32) == -1)
goto exit;
@@ -320,6 +327,7 @@ object_state_write (CamelObject *object,
for (ii = 0; ii < n_properties; ii++) {
GParamSpec *pspec = properties[ii];
guint32 tag, v_uint32;
+ gint32 v_int32;
if ((pspec->flags & CAMEL_PARAM_PERSISTENT) == 0)
continue;
@@ -342,6 +350,14 @@ object_state_write (CamelObject *object,
if (camel_file_util_encode_uint32 (fp, v_uint32) == -1)
goto exit;
break;
+ case G_TYPE_INT:
+ tag |= CAMEL_ARG_INT;
+ v_int32 = g_value_get_int (&value);
+ if (camel_file_util_encode_uint32 (fp, tag) == -1)
+ goto exit;
+ if (camel_file_util_encode_fixed_int32 (fp, v_int32) == -1)
+ goto exit;
+ break;
default:
if (pspec->value_type == CAMEL_TYPE_THREE_STATE) {
tag |= CAMEL_ARG_3ST;
diff --git a/src/libedataserver/e-source-mail-account.c b/src/libedataserver/e-source-mail-account.c
index 6b27fe6d6..5dab9c7fc 100644
--- a/src/libedataserver/e-source-mail-account.c
+++ b/src/libedataserver/e-source-mail-account.c
@@ -48,13 +48,17 @@ struct _ESourceMailAccountPrivate {
gchar *identity_uid;
gchar *archive_folder;
gboolean needs_initial_setup;
+ EThreeState mark_seen;
+ gint mark_seen_timeout;
};
enum {
PROP_0,
PROP_IDENTITY_UID,
PROP_ARCHIVE_FOLDER,
- PROP_NEEDS_INITIAL_SETUP
+ PROP_NEEDS_INITIAL_SETUP,
+ PROP_MARK_SEEN,
+ PROP_MARK_SEEN_TIMEOUT
};
G_DEFINE_TYPE (
@@ -86,6 +90,18 @@ source_mail_account_set_property (GObject *object,
E_SOURCE_MAIL_ACCOUNT (object),
g_value_get_boolean (value));
return;
+
+ case PROP_MARK_SEEN:
+ e_source_mail_account_set_mark_seen (
+ E_SOURCE_MAIL_ACCOUNT (object),
+ g_value_get_enum (value));
+ return;
+
+ case PROP_MARK_SEEN_TIMEOUT:
+ e_source_mail_account_set_mark_seen_timeout (
+ E_SOURCE_MAIL_ACCOUNT (object),
+ g_value_get_int (value));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -118,6 +134,20 @@ source_mail_account_get_property (GObject *object,
e_source_mail_account_get_needs_initial_setup (
E_SOURCE_MAIL_ACCOUNT (object)));
return;
+
+ case PROP_MARK_SEEN:
+ g_value_set_enum (
+ value,
+ e_source_mail_account_get_mark_seen (
+ E_SOURCE_MAIL_ACCOUNT (object)));
+ return;
+
+ case PROP_MARK_SEEN_TIMEOUT:
+ g_value_set_int (
+ value,
+ e_source_mail_account_get_mark_seen_timeout (
+ E_SOURCE_MAIL_ACCOUNT (object)));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -194,6 +224,36 @@ e_source_mail_account_class_init (ESourceMailAccountClass *class)
G_PARAM_EXPLICIT_NOTIFY |
G_PARAM_STATIC_STRINGS |
E_SOURCE_PARAM_SETTING));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_MARK_SEEN,
+ g_param_spec_enum (
+ "mark-seen",
+ "Mark Seen",
+ "Three-state option for Mark messages as read after N seconds",
+ E_TYPE_THREE_STATE,
+ E_THREE_STATE_INCONSISTENT,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_EXPLICIT_NOTIFY |
+ G_PARAM_STATIC_STRINGS |
+ E_SOURCE_PARAM_SETTING));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_MARK_SEEN_TIMEOUT,
+ g_param_spec_int (
+ "mark-seen-timeout",
+ "Mark Seen Timeout",
+ "Timeout in milliseconds for Mark messages as read after N seconds",
+ 0, G_MAXINT,
+ 1500,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_EXPLICIT_NOTIFY |
+ G_PARAM_STATIC_STRINGS |
+ E_SOURCE_PARAM_SETTING));
}
static void
@@ -408,3 +468,87 @@ e_source_mail_account_set_needs_initial_setup (ESourceMailAccount *extension,
g_object_notify (G_OBJECT (extension), "needs-initial-setup");
}
+
+/**
+ * e_source_mail_account_get_mark_seen:
+ * @extension: an #ESourceMailAccount
+ *
+ * Returns: an #EThreeState, whether messages in this account
+ * should be marked as seen automatically.
+ *
+ * Since: 3.32
+ **/
+EThreeState
+e_source_mail_account_get_mark_seen (ESourceMailAccount *extension)
+{
+ g_return_val_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension), E_THREE_STATE_INCONSISTENT);
+
+ return extension->priv->mark_seen;
+}
+
+/**
+ * e_source_mail_account_set_mark_seen:
+ * @extension: an #ESourceMailAccount
+ * @mark_seen: an #EThreeState as the value to set
+ *
+ * Sets whether the messages in this account should be marked
+ * as seen automatically. An inconsistent state means to use
+ * global option.
+ *
+ * Since: 3.32
+ **/
+void
+e_source_mail_account_set_mark_seen (ESourceMailAccount *extension,
+ EThreeState mark_seen)
+{
+ g_return_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension));
+
+ if (extension->priv->mark_seen == mark_seen)
+ return;
+
+ extension->priv->mark_seen = mark_seen;
+
+ g_object_notify (G_OBJECT (extension), "mark-seen");
+}
+
+/**
+ * e_source_mail_account_get_mark_seen_timeout:
+ * @extension: an #ESourceMailAccount
+ *
+ * Returns: timeout in milliseconds for marking messages
+ * as seen in this account
+ *
+ * Since: 3.32
+ **/
+gint
+e_source_mail_account_get_mark_seen_timeout (ESourceMailAccount *extension)
+{
+ g_return_val_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension), -1);
+
+ return extension->priv->mark_seen_timeout;
+}
+
+/**
+ * e_source_mail_account_set_mark_seen_timeout:
+ * @extension: an #ESourceMailAccount
+ * @timeout: a timeout in milliseconds
+ *
+ * Sets the @timeout in milliseconds for marking messages
+ * as seen in this account. Whether the timeout is used
+ * depends on e_source_mail_account_get_mark_seen().
+ *
+ * Since: 3.32
+ **/
+void
+e_source_mail_account_set_mark_seen_timeout (ESourceMailAccount *extension,
+ gint timeout)
+{
+ g_return_if_fail (E_IS_SOURCE_MAIL_ACCOUNT (extension));
+
+ if (extension->priv->mark_seen_timeout == timeout)
+ return;
+
+ extension->priv->mark_seen_timeout = timeout;
+
+ g_object_notify (G_OBJECT (extension), "mark-seen-timeout");
+}
diff --git a/src/libedataserver/e-source-mail-account.h b/src/libedataserver/e-source-mail-account.h
index 0c1c468ff..4039b9edb 100644
--- a/src/libedataserver/e-source-mail-account.h
+++ b/src/libedataserver/e-source-mail-account.h
@@ -23,6 +23,7 @@
#define E_SOURCE_MAIL_ACCOUNT_H
#include <libedataserver/e-source-backend.h>
+#include <libedataserver/e-source-enums.h>
/* Standard GObject macros */
#define E_TYPE_SOURCE_MAIL_ACCOUNT \
@@ -98,6 +99,16 @@ gboolean e_source_mail_account_get_needs_initial_setup
void e_source_mail_account_set_needs_initial_setup
(ESourceMailAccount *extension,
gboolean needs_initial_setup);
+EThreeState e_source_mail_account_get_mark_seen
+ (ESourceMailAccount *extension);
+void e_source_mail_account_set_mark_seen
+ (ESourceMailAccount *extension,
+ EThreeState mark_seen);
+gint e_source_mail_account_get_mark_seen_timeout
+ (ESourceMailAccount *extension);
+void e_source_mail_account_set_mark_seen_timeout
+ (ESourceMailAccount *extension,
+ gint timeout);
G_END_DECLS