diff options
author | Milan Crha <mcrha@redhat.com> | 2018-11-07 21:46:15 +0100 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2018-11-07 21:46:15 +0100 |
commit | c559c57c38b1a26043cd5795eebd80c35ebf2ed2 (patch) | |
tree | 0107c381901e52b1e9d73b6c2a8056440fa7acab | |
parent | 36b07dd5de1ea586b566b8ee8e6bb43eb93403b5 (diff) | |
download | evolution-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.in | 4 | ||||
-rw-r--r-- | src/camel/camel-folder.c | 160 | ||||
-rw-r--r-- | src/camel/camel-folder.h | 8 | ||||
-rw-r--r-- | src/camel/camel-object.c | 16 | ||||
-rw-r--r-- | src/libedataserver/e-source-mail-account.c | 146 | ||||
-rw-r--r-- | src/libedataserver/e-source-mail-account.h | 11 |
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 |