| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
Commit 514736f27efeac6d5ad42e055ebabb423d243fb2 in 3.9.5 broke inline
PGP encrypted messages, because the parser was treating the encrypted
message content as an attachment even though the content type is just
text/plain. This ensures the message content is treated correctly.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Configures the EActivity to submit alerts to the EPreviewPane.
|
| |
|
| |
|
|
|
|
|
|
| |
There's now enough hooks in EWebView that it can take over image saving
from EMailDisplay / EMailReader, with the added perk that a "Save Image"
pop-up menu item now appears for images in ALL preview panes.
|
|
|
|
|
| |
Prompts the user to choose a destination file and then asynchronously
saves the image under the cursor to the destination file.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Asynchronously copies the image under the cursor to the clipboard.
This replaces the "cursor-image" property, which attempts to match the
image URI to a subresource from WebKitWebDataSource. The problem with
that approach is EMailDisplay redirects several URI schemes to its own
custom request handlers which further mutate the URI. So for example,
a text/html message may use a "cid:" URI to refer to an embedded image,
which EMailDisplay transforms to a "mail:" URI and finally to a "data:"
URI. The final image URI might not be derivable from the original URI
without retracing the SoupRequest.
The "image-copy" action now calls e_web_view_cursor_image_copy().
This also adds an explicit requirement on gdk-pixbuf-2.0 >= 2.24 for
gdk_pixbuf_new_from_stream_async() / finish().
New functions:
e_web_view_cursor_image_copy()
Removed functions:
e_web_view_get_cursor_image()
e_web_view_set_cursor_image()
|
|
|
|
|
|
|
|
|
| |
Returns a new EActivity for an EWebView-related asynchronous operation,
and emits a "new-activity" signal. By default the EActivity comes loaded
with a GCancellable and sets the EWebView itself as the alert sink (which
means alerts are displayed directly in the content area). The signal
emission allows the EActivity to be further customized and/or tracked by
the application.
|
|
|
|
|
|
|
|
|
|
|
| |
Asynchronously requests data at a URI by way of a SoupRequest to WebKit's
default SoupSession, incorporating both e_web_view_redirect_uri() and the
custom request handlers installed via e_web_view_install_request_handler().
New functions:
e_web_view_request()
e_web_view_request_finish()
|
|
|
|
|
|
|
|
|
|
|
| |
Attempts to derive a suggested filename from the given URI for use in a
"Save As" dialog.
By default the suggested filename is the last path segment of the given
URI (the unless the given URI looks like a query), but subclasses can use
other mechanisms for custom URI schemes. For example, "cid:" URIs in an
email message may refer to a MIME part with a suggested filename in its
Content-Disposition header.
|
|
|
|
|
|
|
|
|
|
| |
Replaces the given URI with a redirected URI as necessary, primarily for
use with custom SoupRequest handlers. Typically this function would be
called just prior to handing a request off to a SoupSession, such as
from a WebKitWebView "resource-request-starting" signal handler.
Case in point: EMailDisplay now implements the redirect_uri() method,
and calls it from its own "resource-request-starting" signal handler.
|
|
|
|
|
|
|
| |
Trivial wrapper for webkit_web_view_get_uri().
Probably made sense while we were transitioning from GtkHTML to WebKit,
but we don't need it anymore.
|
| |
|
| |
|
|
|
|
| |
Not worth having dedicated EWebView APIs for this.
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Don't expose public API for this.
Even though it's still possible through the WebKitWebView API, we don't
want to encourage setting an arbitrary WebKitWebSettings on an EWebView.
Removed functions:
e_web_view_set_settings()
e_web_view_get_default_settings()
|
| |
|
|
|
|
|
|
| |
Rename to e_mail_display_set_part_list().
Function takes an EMailPartList, not an "EMailPartsList".
|
|
|
|
|
|
| |
Rename to e_mail_display_get_part_list().
Function returns an EMailPartList, not an "EMailPartsList".
|
| |
|
| |
|
|
|
|
| |
https://bugzilla.gnome.org/show_bug.cgi?id=386113
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
Any provider can return a generic error code, which makes the check
useless, only hiding important error information from a user. Since
the camel_getaddrinfo() returns CAMEL_SERVICE_ERROR_URL_INVALID,
the check could be adapted and be more useful.
|
|
|
|
|
|
|
|
|
|
| |
Connect to the GtkComboBox::changed signal after all candidates are
added, to avoid calling e_source_config_check_complete() before the
candidate has been told to insert widgets. This can cause run-time
warnings such as:
(evolution:7106): evolution-cal-config-webcal-CRITICAL **:
cal_config_webcal_check_complete: assertion `context != NULL' failed
|
| |
|
| |
|
| |
|
|
|
|
| |
Same issue as in bug 703991, just in a different place.
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Avoid disconnecting signal handlers through searches since we can't be
sure what else it might disconnect.
|
| |
|
|
|
|
| |
Return type is a boolean, not an integer count.
|
| |
|
|
|
|
|
|
|
| |
* Use GIO-style async parameters.
* Add mail_folder_cache_note_store_finish().
* Do the bulk of the work in a thread so the logic is more readable.
* Queue multiple calls for the same CamelStore and share the results.
|
|
|
|
| |
Mostly for symmetry with e_mail_store_go_online_sync().
|
|
|
|
| |
Need for new mail_folder_cache_note_store() implementation.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
So subclasses can safely chain up without checking for NULL.
|
| |
|
|
|
|
|
|
|
|
| |
Apparently the migration logic was more complex than it needed to be.
The old numeric key was already synced to the EMailReplyStyle enum in
the source code. Dunno where I got the idea it wasn't.
Just more evidence numeric enum keys are bad.
|
|
|
|
|
| |
Directly indicate the signal ID to be emitted from the update callback
instead of playing silly games with boolean flags.
|
|
|
|
|
|
|
|
|
|
| |
* Stop using recursive mutexes.
* Give StoreInfo a reference count.
* Give FolderInfo a reference count.
* Track CamelFolders with GWeakRef instead of weak pointers.
* Submit updates directly to the GMainContext, like we do in EDS,
instead of dequeuing them all from a single idle callback that
we then have to track.
|
|
|
|
|
| |
The "stores" hash table is created on instance init and destroyed with
the cache itself. It is never NULL during MailFolderCache's lifetime.
|
|
|
|
|
|
|
|
| |
Take a CamelStore and folder name instead of a CamelFolder.
CamelStore and folder name can easily be obtained from either a folder
URI or a CamelFolder instance, and the function is more efficient with
separate parameters.
|
|
|
|
|
|
|
|
| |
Replaces mail_folder_cache_get_folder_from_uri().
Returns the CamelFolder for the CamelStore and folder name if available,
or else NULL if a CamelFolder instance is not yet cached. This function
does not block.
|
|
|
|
|
|
|
|
|
| |
Returns whether MailFolderCache has information about the folder
described by the CamelStore and folder name. This does not necessarily
mean it has the CamelFolder instance, but it at least has some meta-data
about it.
You can use this function as a folder existence test.
|
|
|
|
|
|
| |
New functions:
mail_folder_cache_ref_main_context()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
I considered replacing the "session" property with a "registry"
property, but that just complicates application startup even more.
Fact is, if we have a CamelStore then we can get the CamelSession
and even the ESourceRegistry from it. Kinda dirty, but works.
It goes a little something like this...
camel_service = CAMEL_SERVICE (camel_store);
camel_session = camel_service_get_session (camel_service);
mail_session = E_MAIL_SESSION (camel_session);
registry = e_mail_session_get_registry (mail_session);
Removed functions:
mail_folder_cache_get_session()
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
I've got UI freeze in a call of e_book_client_view_stop() on contact
store dispose, caused by synchronous D-Bus call. Doing the call
in a dedicated thread makes no UI freeze here.
|
| |
|
| |
|
|
|
|
|
| |
We were leaking the EActivity. Wonder if this is the mystery activity
that's been blocking application shutdown lately.
|
|
|
|
| |
No longer used.
|
|
|
|
|
|
|
|
| |
We were using g_object_get() to write an "unsigned int" value (at least
32 bits) into a 16-bit integer address.
Don't know why we were bothering with g_object_get() in the first place,
just call camel_network_settings_get_port() instead.
|
|
|
|
|
|
|
| |
A resize abort of an event's end time in a day view didn't restore
original event size, because the drawing function updated event's
structure, when it should not. The resize of a start time could be
aborted without any problem.
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
My previous patch didn't go far enough to repair an already-corrupted
"show-headers" key. Need to actually reset it to its default value if
the "headers" key is empty.
|
|
|
|
|
| |
The list of minicards in reflow is populated on demand, and this was
a place where the demand was not satisfied, if it was missing.
|
|
|
|
|
|
| |
Unfinished undo framework from ages past.
Nice idea I guess, but not worth the complexity.
|
|
|
|
|
|
|
|
|
|
| |
Simo Sorce sent me an interesting case where the MIME type of the
message itself was image/gif, but the image was not being shown.
If the EMailPart representing the message body is marked as an
attachment, wrap it as such so it gets added to the attachment
bar but also set the "force_inline" flag since it doesn't make
sense to collapse the message body if we can render it. */
|
|
|
|
|
|
|
|
| |
nautilus-sendto has been stripped of its usefulness in GNOME 3.8.
It no longer has a UI of its own, it just immediately spawns a mail
client with a set of files as attachment arguments for a new message.
There's no reason for Evolution to be invoking it anymore.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
SpamAssassin is clearly not intended for use by mail clients, as
evidenced by the number of backflips Evolution's SA module still has to
do just to detect the presence and nature of a running spamd (a problem
which D-Bus solved a decade ago), and recent SA developer comments.
In lieu of removing SA support entirely, remove all the crazy GSettings
that are (thankfully) not exposed in the UI and relegate Evolution's SA
integration to only the most basic usage (spamassassin / sa-learn).
Users are better off with Bogofilter anyway. Leave SpamAssassin for
mail servers.
|
|
|
|
|
|
|
|
| |
Nudging EPlugin closer to full removal.
Nothing in Evolution uses this anymore and 3rd-party plugins should be
using EShell's "event::ready-to-start" signal or else GApplication's
"startup" signal.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Declare the instance and class structs normally so Gtk-Doc can make
sense of it.
|
|
|
|
|
| |
Declare the instance and class structs normally so Gtk-Doc can make
sense of it.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Evolution is still occasionally getting stuck on shutdown, and although
the evolution-shell log domain shows debug messages for activities that
are preventing shutdown, they frequently look like this:
(evolution:13534): evolution-shell-DEBUG: 5 active 'mail' activities:
(evolution:13534): evolution-shell-DEBUG: * (no description)
(evolution:13534): evolution-shell-DEBUG: * (no description)
(evolution:13534): evolution-shell-DEBUG: * (no description)
(evolution:13534): evolution-shell-DEBUG: * (no description)
(evolution:13534): evolution-shell-DEBUG: * (no description)
I think the lack of descriptions is from CamelOperations popping all
their pushed messages, which is correct behavior but doesn't help us
debug the problem.
e_activity_get_last_known_text() returns the most recent _non-empty_
text value set on the EActivity. So our debug message can fall back
to that if the EActivity has no description at shutdown:
(evolution:13534): evolution-shell-DEBUG: * (was "blah, blah, blah")
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
|
|
|
|
|
|
|
| |
gal_view_collection_new() now takes system and user directory arguments
and loads GalViews during instance initialization.
Removed functions:
gal_view_collection_set_storage_directories()
gal_view_collection_load()
gal_view_collection_loaded()
|
|
|
|
|
|
|
|
| |
EShellView no longer needs help from subclasses other than getting
the needed GalView subclasses registered.
A nice side-effect of this is EShellView subclasses can now use the
G_DEFINE_DYNAMIC_TYPE macro.
|
|
|
|
|
|
| |
No longer needed. Instead, use g_type_ensure() to ensure the necessary
GalView subclasses are registered in the GType system before loading a
GalViewCollection. Best place to ensure types is from GClassInitFunc.
|
|
|
|
|
|
|
|
|
| |
Given a type code string from an XML file, find the appropriate GType by
traversing the GType hierarchy from GAL_TYPE_VIEW and checking the class
structures for a matching type code string.
This completely eliminates the need for what's left of GalViewFactory.
Now it's just a matter of cleaning up the remains.
|
| |
|
| |
|
|
|
|
|
|
| |
GalViewInstance and EMailPanedView need access. Currently they're just
using the public GalViewCollection members directly, but those are about
to be sealed up.
|
|
|
|
|
|
|
|
|
|
| |
Just readable for now, but I plan to make it also construct-only.
(Despite the precendence, I prefer "user" over "local" for the name.)
New functions:
gal_view_collection_get_user_directory()
|
|
|
|
|
|
|
|
| |
Just readable for now, but I plan to make it also construct-only.
New functions:
gal_view_collection_get_system_directory()
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
It's set by EShellView but not actually used for anything.
Removed functions:
gal_view_collection_set_title()
|
|
|
|
|
|
| |
Removed functions:
gal_view_collection_display_view()
|
|
|
|
|
| |
GalViewFactory can now use its "gal_view_type" class member to
instantiate an appropriate GalView without help from subclasses.
|
|
|
|
|
| |
GalViewFactory can now use its "gal_view_type" class member to peek at
the appropriate GalViewClass and return its static "type_code" string.
|
|
|
|
|
|
|
| |
This is the GType of the GalView instances the factory creates.
Having this information will allow GalViewFactoryClass to do more itself
and be less reliant on subclasses.
|
|
|
|
|
| |
I suspect this will enable us to ditch GalViewFactory entirely once I
rework a few more things. We'll see though; one step at a time here.
|
|
|
|
|
|
| |
All GalView subclasses return a static string in their get_type_code()
methods, so replace the method with a static string pointer directly in
the class structure, and remove the "type-code" GalView property.
|
|
|
|
|
| |
It's better to have separate classes each with a fixed type code, than
one class with a variable type code. You'll see why in the next commit.
|
|
|
|
|
|
|
|
| |
No longer needed.
Removed functions:
gal_view_factory_etable_get_specification()
|
|
|
|
| |
Obtain the ETableState from the attached ETable or ETree as needed.
|
|
|
|
| |
No longer used.
|
|
|
|
|
|
|
| |
Instead, lazily load the state file once an ETable or ETree is attached,
since we need its ETableSpecification to create an ETableState instance.
This means GalViewFactoryEtable can lose its ETableSpecification too.
|
| |
|
|
|
|
|
| |
This replaces the get_title() and set_title() class methods, since
it's silly to defer to subclasses to track a simple string property.
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
No longer used.
Removed functions:
gal_view_factory_get_title()
|
|
|
|
|
|
|
|
| |
No longer used.
Removed functions:
gal_view_edit()
|
|
|
|
| |
No longer user.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
|
|
|
|
|
|
|
| |
The "Define Views" dialog is nearly useless. Replace it with a "Delete
Current View" menu item which is only visible for custom views that have
been explicitly saved under a new name.
There's actually no loss of functionality with this commit. Although
some view management tasks now require more clicks, view management in
general is a seldom-used feature and I doubt the dialog's absence will
even be noticed by users, much less missed.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
EShellView now holds a reference to the active GalViewInstance. Where
applicable, the EShellView subclass is responsible for keeping this up
to date when the sidebar selection changes.
Holding a reference allows EShellView to implement common actions like
"Save Current View" directly instead pushing it on to subclasses.
New functions:
e_shell_view_get_view_instance
e_shell_view_set_view_instance
|
| |
|
| |
|
|
|
|
|
| |
The e_shell_content_get_view_id() and e_shell_content_set_view_id()
header file declarations have no implementation.
|
| |
|
|
|
|
|
| |
Added a comment to the page about a link from Seahorse, so that the
seahorse help is suitably changed if this page is renamed/deleted.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
e_table_specification_new() now takes a table specification filename and
a GError and parses the file as part of instance creation. If a file or
parse error occurs, e_table_specification_new() returns NULL.
This replaces e_table_specification_load_from_file().
New functions:
e_table_specification_get_filename()
Removed functions:
e_table_specification_load_from_file()
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
|
| |
Create our own ETableState and call e_table_state_load_from_string()
followed by e_tree_set_state_object().
|
|
|
|
|
| |
Use e_tree_get_state_object() and e_tree_set_state_object() instead to
transfer state info from one ETree instance to another.
|
|
|
|
|
|
| |
Use e_table_state_duplicate() and e_table_set_state_object().
Similarly for e_tree_set_state().
|
| |
|
| |
|
|
|
|
|
|
|
| |
No longer used outside of e-table-specification.c.
Its logic is merged into e_table_specification_load_from_file(), but
that too will be removed momentarily.
|
|
|
|
|
|
| |
Also remove e_tree_construct_from_spec_file().
Use e_tree_new() or e_tree_construct() instead.
|
|
|
|
|
|
| |
Also remove e_table_construct_from_spec_file().
Use e_table_new() or e_table_construct() instead.
|
|
|
|
|
| |
Creating an ETableSpecification is failable, so it's now up to the
caller to do that and handle errors before calling e_tree_new().
|
|
|
|
|
| |
Creating an ETableSpecification is failable, so it's now up to the
caller to do that and handle errors before calling e_table_new().
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
|
| |
The other parts of this UI still look ancient, but this is a good first
step. Plus we can remove a number of now-unused ETable-related classes.
|
|
|
|
|
| |
A new ETable column selection and ordering widget that looks like
it was written in the 21st century. Derives from ETreeViewFrame.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
No longer used.
|
|
|
|
| |
No longer used.
|
|
|
|
| |
Use g_file_get_contents() and e_table_specification_load_from_string().
|
|
|
|
| |
New parser implementation that uses GMarkupParser instead of libxml2.
|
|
|
|
| |
New parser implementation that uses GMarkupParser instead of libxml2.
|
|
|
|
| |
New parser implementation that uses GMarkupParser instead of libxml2.
|
|
|
|
|
|
|
|
| |
Replace ETableSortColumn with separate ETableColumnSpecification and
GtkSortType parameters in the "get_nth" and "set_nth" functions.
Makes some other parts of the code simpler since it no longer has to
translate a column number to a column specification.
|
| |
|
|
|
|
| |
And convert them to GArrays internally.
|
|
|
|
| |
So we don't have to worry about negative values.
|
|
|
|
| |
Use e_table_sort_info_sorting_get_count() to obtain the value.
|
|
|
|
| |
Use e_table_sort_info_grouping_get_count() to obtain the value.
|
|
|
|
| |
Use e_table_sort_info_get_can_group() to obtain the value.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
ETableSortInfo now keeps a weak reference on the ETableSpecification to
which it's associated. The plan is to replace the column index numbers
with a direct reference to an ETableColumnSpecification from the spec.
New functions:
e_table_sort_info_ref_specification()
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
I don't remember why E_TASK_TABLE_DEFAULT_STATE was needed when
e-calendar-table.etspec already specifies a default ETableState.
Some of the column numbers it was referencing weren't even valid.
Removing it seems to make no difference in Evolution.
|
|
|
|
|
|
|
| |
I don't remember why E_MEMO_TABLE_DEFAULT_STATE was needed when
e-memo-table.etspec already specifies a default ETableState.
Removing it seems to make no difference in Evolution.
|
| |
|
|
|
|
| |
Will eventually replace e_table_header_get_column_by_col_idx().
|
|
|
|
| |
Eliminates a few redundant fields.
|
|
|
|
|
| |
Lookups up the column index of an ETableColumnSpecification, returns a
negative value if no match found.
|
|
|
|
|
| |
Compares two ETableColumnSpecification instances for equality, which
just means they both refer to the same model column number.
|
| |
|
|
|
|
| |
Use e_table_specification_ref_columns() to access column specs.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
ETableState now keeps a weak reference on the ETableSpecification to
which it's associated. The plan is to replace the column index numbers
with a direct reference to an ETableColumnSpecification from the spec.
New functions:
e_table_state_ref_specification()
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Done as part of bug #700894
|
| |
|
| |
|
|
|
|
|
| |
Check if the client supports setting 'after start' reminder and disable
it if necessary (and also disabling 'before end of appoint')
|
|
|
|
|
|
|
| |
When the SASL mechanism reports that it can try an "empty password", give
it the opportunity to do so before we demand that the user provide one.
(Patch mostly by mbarnes; thanks)
|
| |
|
|
|
|
|
|
|
| |
The network-available property was unset when going offline, but
never set again, which caused download of messages for offline use
broken, because it downloads for offline only if the network-available
is set.
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
| |
EMailPrintConfigHeaders is pretty simple now that we delegate most
of the meat and potatoes tree view handling to our new parent class.
|
|
|
|
|
|
|
|
|
|
|
|
| |
ETreeViewFrame embeds a GtkTreeView in a scrolled window and adds an
inline-style toolbar beneath the scrolled window which can be hidden.
The inline-style toolbar supports "add" and "remove" actions, as well
as move actions if the tree view is reorderable and selection actions
if the tree view supports multiple selections. The action set can be
extended through e_tree_view_frame_insert_toolbar_action().
This also adds a small demo program: test-tree-view-frame
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
Set an urgency hint on dialog's parent, or dialog itself, when it has
no parent, to get user's attention to the dialog. For example, when
there is a changed mail composer window on a different workspace than
evolution's main window and user invokes quit by File->Quit in evolution,
then the window is waiting for a response on the composer, but there
was no hint it's waiting for anything.
|
| |
|
|
|
|
|
|
|
| |
Skip leading whitespace and hand the rest to g_uri_parse_scheme().
If that can identify a scheme then make the open button sensitive.
(Have to be careful to skip leading whitespace when opening, too.)
|
|
|
|
|
|
|
|
| |
Replace the big, bulky "open URL" button with a clickable icon directly
in the text entry field. This saves precious vertical space, especially
in the contact editor.
Also remove e_url_entry_get_entry() since EUrlEntry now IS a GtkEntry.
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
management" guides
This avoids having ten undistinguishable links to with exactly the same names in the 'More Information' section at the bottom of the Yelp help browser for all those Account Management topic pages. Instead they know mention which account type they specifically link to.
Thanks to Kat and Shaun for the help.
|
| |
|
|
|
|
| |
so you don't only see 'IMAP' as link title at the bottom of the 'IMAP Subscriptions' page
|
| |
|
| |
|