2000-07-05 Dan Winship * mail-identify.c (mail_identify_mime_part): Use the gnomevfs sniff buffer interface to try to identify the MIME type when everything else fails. * mail-display.c (on_object_requested): * mail-format.c (lookup_handler, handle_undisplayable, handle_audio): s/gnome_mime/gnome_vfs_mime/ * Makefile.am: Add gnomevfs stuff 2000-07-03 Ettore Perazzoli * component-factory.c (create_folder): Get rid of a compiler warning by making sure `folder' is always initialized to some value for any code path. 2000-07-03 Dan Winship * message-list.c (select_msg): call mail_display_set_message with NULL if the message we tried to select doesn't exist (probably meaning we tried to selecte the first message and the folder is empty.) * mail-display.c (mail_display_set_message): deal with NULL as an input (meaning "undisplay previous message and display nothing"). 2000-07-02 Dan Winship * mail-ops.c (real_fetch_mail): Remove hack to redisplay the inbox, since folder_changed signals will now be emitted appropriately. * component-factory.c (create_vfolder_storage): Fix filter_driver_new invocation. * Makefile.am (bin_PROGRAMS): test-mail and test-thread should be noinst. * mail-ops.c (real_fetch_mail): (vfolder_editor_clicked): * component-factory.c (create_vfolder_storage): Pass mail_uri_to_folder and rules to filter_driver_new. 2000-07-02 Ettore Perazzoli * folder-browser.c (mail_uri_to_folder): Fix double freeing of the local exception `ex'. 2000-07-01 Ettore Perazzoli * mail-ops.c (refile_msg): Only allow type "mail" in the folder selection dialog. 2000-07-01 Dan Winship * pixmaps.h, pixmaps/*.xpm: Removed. These aren't being used any more. (The real pixmaps are in ../art.) 2000-07-01 Jeffrey Stedfast * message-list.c (get_message_info): (select_msg): Updated to reflect camel-folder changes. * mail-ops.c (real_fetch_mail): Modified to reflect camel-folder changes. 2000-06-30 Dan Winship * mail-ops.c (print_msg): Use gnome-print to do a print preview. * folder-browser-factory.c: Hook up "Print" button. * message-list.c (message_list_foreach): New function, a wrapper around e_table_selected_row_foreach, which calls the callback function with UIDs rather than row numbers. * folder-browser-factory.c: Remove never-used "Find" button from the toolbar and replace it with "Refile". (We need a better icon for this...). Hook up "Refile" to "refile_msg". * mail-ops.c (refile_msg): Call the shell's user_select_folder routine, and then use message_list_foreach and real_refile_msg to do the work. (delete_msg): Update to use message_list_foreach. * folder-browser.c (mail_uri_to_folder): new function, extracted from folder_browser_load_folder, to turn a URI into a folder. (folder_browser_load_folder): Use it. 2000-06-30 Peter Williams * component-factory.c (create_news_storage, create_imap_storage): Fixed to use new EvolutionShellClient proxy thingamajiggie. 2000-06-30 Dan Winship * message-list.c (on_row_selection): use the ETable row_selection signal to track how many rows are selected. Eventually we will use this info to disable toolbar buttons when you have too few/too many messages selected, but the current toolbar widget doesn't allow that. * message-list.h, message-list.c, mail-ops.c: Change selected_row and selected_uid fields of MessageList to cursor_row and cursor_uid to be more correct according to the new ETable interfaces. 2000-06-30 Ettore Perazzoli * component-factory.c: Eeek. Fix typo: add missing star in the declaration of `global_shell_client'. 2000-06-29 Ettore Perazzoli * component-factory.c: Replace `global_shell_interface' with `global_shell_client'. 2000-06-29 Jeffrey Stedfast * mail-ops.c (delete_msg): Clean up compile warnings (real_fetch_mail): Fetching from IMAP should do nothing 2000-06-29 Christopher James Lahey * mail-ops.c: Handle multiple deletes (change by Peter Williams.) 2000-06-29 Jeffrey Stedfast * folder-browser-factory.c: Changed "Send" to "Compose" to avoid user confusion. Compose is a little more intuitive. Also changed the pixmap to MAIL_NEW instead of MAIL_SND * mail-ops.c (compose_msg): Renamed to avoid confusion 2000-06-29 Dan Winship * component-factory.c (create_imap_storage, create_news_storage): remove some code incorrectly copied and pasted from create_vfolder_storage which caused vfolder creation to stop working. 2000-06-29 Christopher James Lahey * message-list.c, mail-ops.c: Changed the name of e_table_select_row to e_table_set_cursor_row. 2000-06-29 Peter Williams * message-list.c (message_list_init): Set the dnd_code of the ETableHeader to something so that Solaris sprintf doesn't die on a NULL string. * mail-config.c (providers_config_new): Check for a null "transport" string (not all OS' handle NULL strings well *cough* Solaris) 2000-06-28 Dan Winship * mail-format.c (mail_generate_forward): add default subjects * component-factory.c (create_folder): Refuse to create folders not of type "mail", and correctly create an empty "mbox" folder for new folders in /local. * main.c (init_corba): Call od_assert_using_oaf() or od_assert_using_goad() as appropriate to make sure people didn't somehow trick the build system. 2000-06-28 Jeffrey Stedfast * message-list.c: Added prototype for filter_date to make it build cleanly 2000-06-27 Christopher James Lahey * message-list.c: Made dates display grouping information properly. 2000-06-27 Peter Williams * message-list.c (mark_msg_seen): Need to return a value on error. * main.c (main): Don't start threads or enter threads if there's no threading! Sigh. * test-thread.c: Don't compile if no threads. * session.c: Work without broken threads. * message-list.c (filter_date): Solve the ctime_r problem the correct way, with the magic of autoconf. 2000-06-27 Christopher James Lahey * message-list.c: Work around mismatched ctime_r functions. This will be fixed. 2000-06-27 Peter Williams * mail-threads.c: Don't compile this if we don't have threads enabled. This should maybe be on the Makefile.am level. 2000-06-27 Michael Zucchi * component-factory.c (owner_set_cb): Put in a gross hack to export the shell reference elsewhere. 2000-06-26 Christopher James Lahey * message-list.c: Added a value_to_string handler. 2000-06-26 Peter Williams * component-factory.c, mail-ops.c: #ifdef the threads stuff so that if USE_BROKEN_THREADS is not defined we just call the functions in the main thread. * mail-threads.h: Don't declare funcs if USE_BROKEN_THREADS not defined. * mail-threads.c: Put the query and message boxes on top so that you can see them. 2000-06-26 Jeffrey Stedfast * mail-config.c (error_dialog): va_start() returns void, don't assign it's retval to a variable. 2000-06-26 Ettore Perazzoli * main.c (main): Call `GDK_THREADS_ENTER()' and `GDK_THREADS_LEAVE()' around the main loop as in the examples from the GTK+ FAQ. * mail-threads.c (DEBUG): New macro for debugging. (read_msg): Use it. 2000-06-25 Peter Williams * Makefile.am: Clean up the various _LIBS and _CFLAGS to work with simpler THREADS_LIBS and THREADS_CFLAGS scheme. 2000-06-23 Jeffrey Stedfast * folder-browser.c (folder_browser_load_folder): Improved the code to separate the imap namespace from the folder name. 2000-06-23 Peter Williams * component-factory.c: Include e-util/e-setup.h for the prototype of evolution_dir; prototype create_news_storage. (real_create_imap_storage, real_create_news_storage): New functions moving the camel stuff into the async callback. (create_imap_storage, create_news_storage): Chopped in half to move camel stuff as above. * mail-ops.c: Include "mail-threads.h" for threading protos. (real_fetch_mail, real_send_mail, real_expunge_folder): New functions moving the camel stuff into the async callback. (async_mail_exception_dialog): A version of mail_exception_dialog to be called from the async handlers (just calls mail_op_error()) (fetch_mail, expunge_folder, composer_send_cb): Cut in half to move camel stuff as above. (cleanup_send_mail): Clean up after the async real_send_mail with the gtk_object_destroys et al. * mail-threads.c: Instead of hiding the progress bar, make it zip back and forth constantly. (progress_timeout): New func. Timeout called to make the pbar shimmy. (timeout_toggle): New func. Turn on and off the shimmy effect. (check_cond): New func. Make sure that the GCond for modal operation is initialized before mail_op_{error,get_password}. (show_error_clicked, read_msg, get_password_clicked): Move over to timeout_toggle. (mail_op_error,mail_op_get_password): Add check_cond() call. * main.c: (main) Call g_thread_init. * session.c: Change auth_callback stuff over to assume that it's being called async. Note: no real good way to tell if this is the case or not. (request_callback): ifdef'ed out (evolution_auth_callback): Use mail_op_get_password. 2000-06-22 Jeffrey Stedfast * folder-browser.c (folder_browser_load_folder): Now should correctly get the selected folder from the given URL. 2000-06-22 Chris Toshok * folder-browser.c (folder_browser_load_folder): add handling for loading "news:" folders. * component-factory.c (create_news_storage): add a root for news source. (owner_set_cb): call create_news_storage. 2000-06-22 Jeffrey Stedfast * folder-browser.c (folder_browser_load_folder): Updated to prepend url-> path if it exists for that imap store. * component-factory.c (create_imap_storage): Modified to not prepend a hard-coded namespace. 2000-06-22 Chris Toshok * mail-ops.c (fetch_mail_cleanup): new function, passed as arg to mail_operation_try. (fetch_mail): add cleanup func arg. 2000-06-22 Christopher James Lahey * message-list.c: Changed ml_value_at to return "" instead of NULL in some cases. 2000-06-22 Peter Williams * Makefile.am: Add GNOME_EXTRA_LIBS so that we get libgthread in our LIBS for evolution-mail. * mail-threads.c: Make the dialog boxes for error and question non-modal. They're modal relative to the dispatch thread, but before they would also eg lock up the toolbar buttons (while the menus, managed by another process, were active -- a weird effect). 2000-06-22 Peter Williams * mail-threads.[ch]: Extra argument to mail_operation_try: 'cleanup', a function to be called in the main thread after the dispatcher thread exits. gtk_object_destroy's et al may attempt to unmap windows so we can't do them in the dispatcher thread :-( * test-thread.c: Updated with demo of new argument working. 2000-06-22 Peter Williams * test-thread.c (op_5): New tests for the get_password hook. * mail-threads.[ch]: New hook, mail_op_get_password, for getting a user response from an async operation. The operation blocks while waiting for the response. A big whole mutex condition threading blocking dealie to make sure that it works. Also the error hook creates a dialog again, which also needs to block its caller while we wait for the user to press ok. 2000-06-22 Peter Williams * mail-threads.c (various functions): Prettify the UI so that the progress bar doesn't become all huge 'n stuff. (mail_operation_try): Now save the operation's description, so that we can display it later as the default message. (read_msg): When the operation starts set the label to its UI-friendly name. (dispatch_func): Free the saved prettyname. 2000-06-21 Christopher James Lahey * message-list.c: Removed an erroneous comment. 2000-06-21 Dan Winship * mail-config.c (create_transport_page): Make this not crash if you don't have a transport configured. * message-list.c: Update received date to work like sent date. 2000-06-21 Peter Williams * mail-thread.{c,h}: New files -- a simple API for executing the major mail ops (fetch_mail etc) asynchronously, allowing the operations to send messages and update a progress bar. * test-thread.{c,h}: Tests the mail-thread API. * Makefile.am: add mail-thread.[ch] to evolution_mail_SOURCES and declare the test_thread noinst_PROGRAM. 2000-06-21 Peter Williams * mail-format.c (mail_generate_reply): Include "e-setup.h" to get the prototype for evolution_dir. 2000-06-20 Jeffrey Stedfast * component-factory.c (create_imap_storage): Oops. Should have checked for a NULL sources. 2000-06-20 Dan Winship * message-list.c (mark_msg_seen): Quick hack to prevent a NULL pointer dereference. Things need to be cleaned up a bit more here though. * mail-sources.c: Oops. This should have been removed a long time ago. 2000-06-20 Jeffrey Stedfast * folder-browser.c (folder_browser_load_folder): Working on getting this to work :) * component-factory.c (create_imap_storage): Should now correctly construct the folder path allowing the selection of a folder. 2000-06-20 Ettore Perazzoli * mail-format.c (mail_generate_reply): Declare `evolution_dir'. Ugly, ugly, ugly, but I am not sure where it should go instead. 2000-06-19 Ettore Perazzoli * mail-ops.c (ask_confirm_for_empty_subject): New function to ask confirmation for an empty subject line. (composer_send_cb): Use it if the subject is empty and only send the message if the user confirms. 2000-06-20 Jeffrey Stedfast * component-factory.c (create_imap_storage): Now creates the IMAP storage (listing subfolders and such) 2000-06-19 Dan Winship * mail-format.c (find_preferred_alternative): add an option to prefer text/plain. (reply_body): add an option to prefer text/plain (mail_generate_reply): Check the mail sending preferences, and generate a text/plain reply if the user prefers to send plain text (and we have a text/plain part to generate a reply from). 2000-06-19 Jeffrey Stedfast * mail-config.c (providers_config_new): Should now correctly display the Transport page (made it set the optionmenu correctly, before it would only set SMTP). (create_transport_page): Updated to set the page info to sendmail/smtp based on the url. (create_service_page): Had to add some code to set data on some objects so I could grab the objects I needed to modify in the above function. 2000-06-18 Jeffrey Stedfast * folder-browser.c (folder_browser_load_folder): started to add code to load an IMAP folder. * component-factory.c: Started to add a create_imap_storage method so that we can eventually have our IMAP store displayed in the tree view. (create_vfolder_storage): Renamed from create_test_storage(). (owner_set_cb): Updated. 2000-06-17 Dan Winship * message-list.c (message_list_set_folder): Prevent double-freeing action on summary_table and uid_rowmap. 2000-06-16 Dan Winship * message-list.c (ml_set_value_at): Implement clicking on the envelope icon to set read/unread. Based on a patch by clahey. (select_msg): keep the timeout id for the "seen" flagging in the message_list structure, so ml_set_value_at can clear it so it doesn't re-mark a message seen after you click it unseen. 2000-06-16 Dan Winship * message-list.c (get_message_row): new function to do a uid to row mapping. (mark_msg_seen, select_msg, message_changed, message_list_set_folder): Update for Camel flag changes. (on_cursor_change_cmd): Rename "row_to_select" to "selected_row", and keep a "selected_uid" as well. * mail-ops.c (composer_send_cb): Update for Camel flag changes, and fix some memory-handling bugs. (Free the post_send_data when the composer is destroyed, not when the user clicks "send", which could happen never, or more than once.) (delete_msg): Update for Camel flag changes, and fix the "holding down the delete key skips some messages" bug. 2000-06-15 Dan Winship * mail-ops.c (fetch_mail): * component-factory.c (owner_unset_cb): * message-list.c (message_list_set_folder): Update for CamelFolder changes. * folder-browser.c (folder_browser_clear_search): New function to revert back to non-searching mode. * mail-ops.c (fetch_mail): Use folder_browser_clear_search. * mail-display.c (on_url_requested): if the document requests an unknown URL, it's not an error; just ignore the URL. * mail-ops.c (fetch_mail): If there's no new mail, tell the user. 2000-06-14 Radek Doulik * main.c (main): call gtkhtmllib_init here 2000-06-13 Jeffrey Stedfast * mail-config.c (on_SourceConfigDialogButton_clicked): Make sure source is always pointing to something, so a blank is not written to the config file on close. 2000-06-13 Ettore Perazzoli * Makefile.am (SHELL_OBJS): Removed. (evolution_mail_LDADD): Use `libeshell.a'. Also use `top_builddir' consistently. 2000-06-12 Jeffrey Stedfast * mail-config.c: Got rid of sources_max_row and identities_max_row as they are not really needed (just use clist->rows) (on_cmdSourcesEdit_clicked): Modified to make 'source' point to the data being edited. (on_cmdSourcesAdd_clicked): Adds a new clist item and selects it so the editor knows where to stick the data when it's done. 2000-06-12 Federico Mena Quintero * message-list.c: Removed the ETableModel thaw handler. 2000-06-12 Dan Winship * folder-browser.c (folder_browser_set_uri): Return the result of folder_browser_load_folder. (get_prop, set_prop, folder_browser_properties_init): Remove. No longer needed. * folder-browser-factory.c (folder_browser_factory_new_control): Add a "uri" argument, return NULL if setting it fails. (folder_browser_factory_new_control): Remove property bag stuff. (folder_browser_factory_init, folder_browser_factory): Remove this, since we're using the component factory now. * component-factory.c (create_view): Update for folder_browser_factory_new_control change and return NOTFOUND as appropriate. * main.c (main): Don't call folder_browser_factory_init. * mail-format.c (mail_generate_reply): Fix the subject generation so we don't get "Re: Re:". This is working around something that may later be declared a misfeature in Camel. 2000-06-10 Ettore Perazzoli * component-factory.c (create_folder): New stub implementation for the folder creation function in the EvolutionShellComponent we expose [it simply returns success all the time]. (factory_fn): Pass this function to `evolution_shell_component_new'. 2000-06-09 Dan Winship * folder-browser.c (folder_browser_new): Add a serial number to FolderBrowser. * folder-browser-factory.c (control_activate, control_deactivate): Include fb serial number in the name of the Bonobo toolbar to prevent problems with disappearing toolbars. This is a kludge and should go away. * mail-ops.c (expunge_folder): display error from camel_folder_expunge if there is one. * message-list.c (select_row): install an idle function to select the row rather than doing it directly. Ugh. What a kludge, but at least it works now. * session.c (evolution_auth_callback): Update for CamelAuthCallback changes. (Uncache passwords when asked to.) * mail-ops.c (fetch_mail): close and expunge the source folder after copying it to a local folder. 2000-06-09 Ettore Perazzoli * component-factory.c (create_view): Updated to match the changes to the definition of `EvolutionShellComponentCreateFn'. If @type is not "mail", return an "unsupported type" error. (factory_fn): Pass NULL for the `remove_folder' and `create_folder' functions. 2000-06-09 Dan Winship * mail-format.c: Redo things a bit so that whitespace-only text parts aren't displayed. (In particular, so that whitespace-only subparts of multipart/mixed aren't displayed as separate (empty) parts.) 2000-06-06 Dan Winship * mail-ops.c (fetch_mail): * folder-browser.c (folder_browser_load_folder): Update for folder creation/existence changes. * message-list.c (message_list_set_folder): Remove the code to create the folder if it doesn't exist, since we don't want to do that. 2000-06-05 Dan Winship * mail-ops.c (composer_send_cb): Leave the composer window around if the message doesn't get sent. 2000-06-05 Matt Loper * folder-browser.c (etable_key): Allow "GDK_KP_Delete", a keypad delete key, to delete a message. 2000-06-05 Dan Winship * session.c (evolution_auth_callback): Remember passwords between calls. (forget_passwords): Callback for "Forget Passwords" menu item. * folder-browser-factory.c (control_activate): (control_deactivate): Add "Forget Passwords" menu item. * mail.h, mail-ops.c: fix some function prototypes * folder-browser.c (etable_key): Add "Delete" = delete message. * mail-format.c (mail_generate_forward): Update for new composer attachment interface. 2000-06-02 Jeffrey Stedfast * mail-config.c (providers_config_new): Added a new notebook page that allowed for mail format (text/plain or multipart/alternative) 2000-06-02 Dan Winship * message-list.c (filter_date): If the date in the summary is 0, output "?". * component-factory.c (create_view): keep a GList of folder browsers created (owner_unset_cb): Go through the list and close each folder before exiting so they sync their summary state, etc to disk. * mail-ops.c (fetch_mail): Use camel_service_connect, not connect_with_url, since we already passed the URL into camel_session_get_store. 2000-06-02 Christopher James Lahey * message-list.c: Use camel_folder_free_summary instead of g_ptr_array_free. Unref the folder when we're done with it. 2000-06-02 Christopher James Lahey * session.c: Revert removal of e_setup_base_dir. 2000-06-02 Dan Winship * folder-browser.c (my_folder_browser_init): Connect to ETable's key_press signal. (etable_key): scroll mail on space/backspace. 2000-06-02 Christopher James Lahey * message-list.c: Made sent column as wide as from column. 2000-06-02 Jeffrey Stedfast * mail-config.c (on_cmdSourcesAdd_clicked): Changed identity_row to source_row as this is a Sources clist we are dealing with and not an identity clist (on_cmdSourcesEdit_clicked): same (on_cmdSourcesDelete_clicked): again, same (on_cmdSourcesEdit_clicked): Source editor now fills in data from the clist 2000-06-01 Dan Winship * message-list.c: Add a date column. (COL_SENT_WIDTH_MIN): Make this wider. (ml_value_at): return the sent date (as a time_t) for COL_SENT. (Fix COL_TO too while I'm here.) (ml_duplicate_value, ml_free_value, ml_initialize_value, ml_value_is_empty): COL_SENT is numeric now. (message_list_init_renderers): Create a date renderer (using text_filter to translate the time_t into a string). (message_list_init_header): Use render_date for COL_SENT. 2000-06-01 Christopher James Lahey * session.c: Don't call e_setup_base_dir. 2000-06-01 Dan Winship * mail-format.c (mail_generate_forward): Fix forwarding to work for people other than me. :) [Although apparently it doesn't really.] * mail-ops.c (delete_msg): Add a quick hack to move the selection down a row when you delete a message. * mail-format.c (handle_message_rfc822): use
rather than
to frame the embedded message. If
 text in the subtable won't fit in the 95% width,
	GtkHTML will write past the border of the table (and
	
causes creeping updates so it's not usable for now). 2000-06-01 Christopher James Lahey * message-list.c (message_list_init): Turn off the grid in our ETable. 2000-06-01 Dan Winship * mail-format.c (write_headers): Oops. This needs to take a message argument because we might be writing headers for an embedded message/rfc822 subpart rather than the root document. 2000-06-01 Jeffrey Stedfast * mail-config.c: Config dialogs are completed. (service_acceptable): Fixed a segfault caused by duplicate camel_exception_free() (providers_config_new): Identity and Source clists are now filled in when the dialog is created as well as the Transport page * folder-browser-factory.c: Renamed Tool/ menu items Vfolder was changed to Virtual Folder and Configure Camel Providers was changed to Mail Configuration 2000-06-01 Ettore Perazzoli * Makefile.am (evolution_mail_LDADD): Link with `libemiscwidgets.a'. * mail-display.c (mail_display_new): Use an EScrollFrame instead of a GtkScrolledWindow. (mail_display_set_message): Likewise. * mail-display.h: Replace the GtkScrolledWindow with an EScrollFrame. 2000-06-01 Dan Winship * component-factory.c (owner_unset_cb): Quit when the shell exits. This is a kludge, but a pretty necessary one until the refcounting bugs that keep the component from exiting properly are fixed. 2000-05-31 Jeffrey Stedfast * mail-config.c: Partially implemented the source configuration, seems to segfault due to a destroyed gnome dialog being destroyed again in the method on_SourceConfigDialogButton_clicked() 2000-05-31 Dan Winship * mail-format.c (free_url, handle_text_enriched, get_url_for_icon): Fix up memory management of x-evolution-data URLs so the URLs and/or their data don't get freed while there are still references to them. * message-list.c (message_list_init_header): redo the (unused) online status column to no longer refer to pixmaps that no longer exist. 2000-06-01 Ettore Perazzoli * folder-browser-factory.c (control_activate): Put the toolbar into a frame to make it look like standard GNOME toolbars. Also, set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not do evil things when its moved to the left or the right of the window. 2000-05-31 Jeffrey Stedfast * mail-config.c: Configuration dialog now allows adding/editing/deleting of Identities (which leaves adding/editing/deleting of sources left to implement). The data is also saved when the dialog is exited via the OK button. 2000-05-31 Dan Winship * mail-format.c (mail_format_mime_message): Initialize the "urls" hash table stored on the message and store cid and other URLs there rather than as object data on the message. (get_cid): rewrite this a bunch (handle_text_enriched): move the code from write_iframe_string() into here, since it's the only place that actually needs it. (handle_text_html): simplify this a lot. We can use a cid: URL here rather than x-evolution-data. (get_url_for_icon): New routine to return URLs for icons, and cache the results, so we don't have to keep re-reading the icon files (and so we can't be spoofed into reading non-icon files). (handle_mystery, handle_audio): use get_url_for_icon. * mail-display.c (save_data): move the CamelMimePart filename extracting code from get_cid to here. (on_link_clicked, on_object_requested): Update for cid: changes. (on_url_requested): Kill off the kludgy, exploitable x-gnome-icon URL schema, update cid and x-evolution-data to match mail-format.c. It should now be easier to implement RFC 2557 (Content-Location, etc), but that RFC still pretty much sucks. 2000-05-30 Dan Winship * mail-format.c: Redo this back to the old way: a single GtkHTML with various things inline in it. (Gets rid of flicker, simplifies some scrolling, selecting, and printing issues.) (handle_text_enriched, handle_text_html): Use