aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/e-selection.c244
-rw-r--r--e-util/e-selection.h23
2 files changed, 267 insertions, 0 deletions
diff --git a/e-util/e-selection.c b/e-util/e-selection.c
index 8d2efff764..0569b1366e 100644
--- a/e-util/e-selection.c
+++ b/e-util/e-selection.c
@@ -48,8 +48,14 @@ enum {
NUM_DIRECTORY_ATOMS
};
+enum {
+ ATOM_HTML,
+ NUM_HTML_ATOMS
+};
+
static GdkAtom calendar_atoms[NUM_CALENDAR_ATOMS];
static GdkAtom directory_atoms[NUM_DIRECTORY_ATOMS];
+static GdkAtom html_atoms[NUM_HTML_ATOMS];
static void
init_atoms (void)
@@ -75,6 +81,11 @@ init_atoms (void)
directory_atoms[ATOM_X_VCARD] =
gdk_atom_intern_static_string ("text/x-vcard");
+ /* HTML Atoms */
+
+ html_atoms[ATOM_HTML] =
+ gdk_atom_intern_static_string ("text/html");
+
initialized = TRUE;
}
@@ -115,6 +126,20 @@ e_target_list_add_directory_targets (GtkTargetList *list,
gtk_target_list_add (list, directory_atoms[ii], 0, info);
}
+void
+e_target_list_add_html_targets (GtkTargetList *list,
+ guint info)
+{
+ gint ii;
+
+ g_return_if_fail (list != NULL);
+
+ init_atoms ();
+
+ for (ii = 0; ii < NUM_HTML_ATOMS; ii++)
+ gtk_target_list_add (list, html_atoms[ii], 0, info);
+}
+
gboolean
e_selection_data_set_calendar (GtkSelectionData *selection_data,
const gchar *source,
@@ -124,6 +149,7 @@ e_selection_data_set_calendar (GtkSelectionData *selection_data,
gint ii;
g_return_val_if_fail (selection_data != NULL, FALSE);
+ g_return_val_if_fail (source != NULL, FALSE);
if (length < 0)
length = strlen (source);
@@ -154,6 +180,7 @@ e_selection_data_set_directory (GtkSelectionData *selection_data,
gint ii;
g_return_val_if_fail (selection_data != NULL, FALSE);
+ g_return_val_if_fail (source != NULL, FALSE);
if (length < 0)
length = strlen (source);
@@ -175,6 +202,37 @@ e_selection_data_set_directory (GtkSelectionData *selection_data,
return FALSE;
}
+gboolean
+e_selection_data_set_html (GtkSelectionData *selection_data,
+ const gchar *source,
+ gint length)
+{
+ GdkAtom atom;
+ gint ii;
+
+ g_return_val_if_fail (selection_data != NULL, FALSE);
+ g_return_val_if_fail (source != NULL, FALSE);
+
+ if (length < 0)
+ length = strlen (source);
+
+ init_atoms ();
+
+ atom = gtk_selection_data_get_target (selection_data);
+
+ /* All HTML atoms are treated the same. */
+ for (ii = 0; ii < NUM_HTML_ATOMS; ii++) {
+ if (atom == html_atoms[ii]) {
+ gtk_selection_data_set (
+ selection_data, atom, 8,
+ (guchar *) source, length);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
gchar *
e_selection_data_get_calendar (GtkSelectionData *selection_data)
{
@@ -221,6 +279,29 @@ e_selection_data_get_directory (GtkSelectionData *selection_data)
return NULL;
}
+gchar *
+e_selection_data_get_html (GtkSelectionData *selection_data)
+{
+ GdkAtom data_type;
+ const guchar *data = NULL;
+ gint ii;
+
+ /* XXX May need to do encoding conversions here.
+ * Not worrying about it for now. */
+
+ g_return_val_if_fail (selection_data != NULL, NULL);
+
+ data = gtk_selection_data_get_data (selection_data);
+ data_type = gtk_selection_data_get_data_type (selection_data);
+
+ /* All HTML atoms are treated the same. */
+ for (ii = 0; ii < NUM_HTML_ATOMS; ii++)
+ if (data_type == html_atoms[ii])
+ return g_strdup ((gchar *) data);
+
+ return NULL;
+}
+
gboolean
e_selection_data_targets_include_calendar (GtkSelectionData *selection_data)
{
@@ -256,6 +337,23 @@ e_selection_data_targets_include_directory (GtkSelectionData *selection_data)
}
gboolean
+e_selection_data_targets_include_html (GtkSelectionData *selection_data)
+{
+ GdkAtom *targets;
+ gint n_targets;
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (selection_data != NULL, FALSE);
+
+ if (gtk_selection_data_get_targets (selection_data, &targets, &n_targets)) {
+ result = e_targets_include_html (targets, n_targets);
+ g_free (targets);
+ }
+
+ return result;
+}
+
+gboolean
e_targets_include_calendar (GdkAtom *targets,
gint n_targets)
{
@@ -291,6 +389,24 @@ e_targets_include_directory (GdkAtom *targets,
return FALSE;
}
+gboolean
+e_targets_include_html (GdkAtom *targets,
+ gint n_targets)
+{
+ gint ii, jj;
+
+ g_return_val_if_fail (targets != NULL || n_targets == 0, FALSE);
+
+ init_atoms ();
+
+ for (ii = 0; ii < n_targets; ii++)
+ for (jj = 0; jj < NUM_HTML_ATOMS; jj++)
+ if (targets[ii] == html_atoms[jj])
+ return TRUE;
+
+ return FALSE;
+}
+
static void
clipboard_get_calendar (GtkClipboard *clipboard,
GtkSelectionData *selection_data,
@@ -388,6 +504,54 @@ e_clipboard_set_directory (GtkClipboard *clipboard,
}
static void
+clipboard_get_html (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ guint info,
+ gchar *source)
+{
+ e_selection_data_set_html (selection_data, source, -1);
+}
+
+static void
+clipboard_clear_html (GtkClipboard *clipboard,
+ gchar *source)
+{
+ g_free (source);
+}
+
+void
+e_clipboard_set_html (GtkClipboard *clipboard,
+ const gchar *source,
+ gint length)
+{
+ GtkTargetList *list;
+ GtkTargetEntry *targets;
+ gint n_targets;
+
+ g_return_if_fail (clipboard != NULL);
+ g_return_if_fail (source != NULL);
+
+ list = gtk_target_list_new (NULL, 0);
+ e_target_list_add_html_targets (list, 0);
+
+ targets = gtk_target_table_new_from_list (list, &n_targets);
+
+ if (length < 0)
+ length = strlen (source);
+
+ gtk_clipboard_set_with_data (
+ clipboard, targets, n_targets,
+ (GtkClipboardGetFunc) clipboard_get_html,
+ (GtkClipboardClearFunc) clipboard_clear_html,
+ g_strndup (source, length));
+
+ gtk_clipboard_set_can_store (clipboard, NULL, 0);
+
+ gtk_target_table_free (targets, n_targets);
+ gtk_target_list_unref (list);
+}
+
+static void
clipboard_request_calendar_cb (GtkClipboard *clipboard,
GtkSelectionData *selection_data,
RequestTextInfo *info)
@@ -411,6 +575,8 @@ e_clipboard_request_calendar (GtkClipboard *clipboard,
g_return_if_fail (clipboard != NULL);
g_return_if_fail (callback != NULL);
+ init_atoms ();
+
info = g_slice_new (RequestTextInfo);
info->callback = callback;
info->user_data = user_data;
@@ -445,6 +611,8 @@ e_clipboard_request_directory (GtkClipboard *clipboard,
g_return_if_fail (clipboard != NULL);
g_return_if_fail (callback != NULL);
+ init_atoms ();
+
info = g_slice_new (RequestTextInfo);
info->callback = callback;
info->user_data = user_data;
@@ -455,6 +623,42 @@ e_clipboard_request_directory (GtkClipboard *clipboard,
clipboard_request_directory_cb, info);
}
+static void
+clipboard_request_html_cb (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ RequestTextInfo *info)
+{
+ gchar *source;
+
+ source = e_selection_data_get_html (selection_data);
+ info->callback (clipboard, source, info->user_data);
+ g_free (source);
+
+ g_slice_free (RequestTextInfo, info);
+}
+
+void
+e_clipboard_request_html (GtkClipboard *clipboard,
+ GtkClipboardTextReceivedFunc callback,
+ gpointer user_data)
+{
+ RequestTextInfo *info;
+
+ g_return_if_fail (clipboard != NULL);
+ g_return_if_fail (callback != NULL);
+
+ init_atoms ();
+
+ info = g_slice_new (RequestTextInfo);
+ info->callback = callback;
+ info->user_data = user_data;
+
+ gtk_clipboard_request_contents (
+ clipboard, html_atoms[ATOM_HTML],
+ (GtkClipboardReceivedFunc)
+ clipboard_request_html_cb, info);
+}
+
gchar *
e_clipboard_wait_for_calendar (GtkClipboard *clipboard)
{
@@ -505,6 +709,31 @@ e_clipboard_wait_for_directory (GtkClipboard *clipboard)
return results.data;
}
+gchar *
+e_clipboard_wait_for_html (GtkClipboard *clipboard)
+{
+ WaitForDataResults results;
+
+ g_return_val_if_fail (clipboard != NULL, NULL);
+
+ results.data = NULL;
+ results.loop = g_main_loop_new (NULL, TRUE);
+
+ e_clipboard_request_html (
+ clipboard, (GtkClipboardTextReceivedFunc)
+ clipboard_wait_for_text_cb, &results);
+
+ if (g_main_loop_is_running (results.loop)) {
+ GDK_THREADS_LEAVE ();
+ g_main_loop_run (results.loop);
+ GDK_THREADS_ENTER ();
+ }
+
+ g_main_loop_unref (results.loop);
+
+ return results.data;
+}
+
gboolean
e_clipboard_wait_is_calendar_available (GtkClipboard *clipboard)
{
@@ -534,3 +763,18 @@ e_clipboard_wait_is_directory_available (GtkClipboard *clipboard)
return result;
}
+
+gboolean
+e_clipboard_wait_is_html_available (GtkClipboard *clipboard)
+{
+ GdkAtom *targets;
+ gint n_targets;
+ gboolean result = FALSE;
+
+ if (gtk_clipboard_wait_for_targets (clipboard, &targets, &n_targets)) {
+ result = e_targets_include_html (targets, n_targets);
+ g_free (targets);
+ }
+
+ return result;
+}
diff --git a/e-util/e-selection.h b/e-util/e-selection.h
index e03399a39e..2c59d3d641 100644
--- a/e-util/e-selection.h
+++ b/e-util/e-selection.h
@@ -42,6 +42,9 @@ void e_target_list_add_calendar_targets
void e_target_list_add_directory_targets
(GtkTargetList *list,
guint info);
+void e_target_list_add_html_targets
+ (GtkTargetList *list,
+ guint info);
gboolean e_selection_data_set_calendar
(GtkSelectionData *selection_data,
const gchar *source,
@@ -50,20 +53,30 @@ gboolean e_selection_data_set_directory
(GtkSelectionData *selection_data,
const gchar *source,
gint length);
+gboolean e_selection_data_set_html
+ (GtkSelectionData *selection_data,
+ const gchar *source,
+ gint length);
gchar * e_selection_data_get_calendar
(GtkSelectionData *selection_data);
gchar * e_selection_data_get_directory
(GtkSelectionData *selection_data);
+gchar * e_selection_data_get_html
+ (GtkSelectionData *selection_data);
gboolean e_selection_data_targets_include_calendar
(GtkSelectionData *selection_data);
gboolean e_selection_data_targets_include_directory
(GtkSelectionData *selection_data);
+gboolean e_selection_data_targets_include_html
+ (GtkSelectionData *selection_data);
gboolean e_targets_include_calendar
(GdkAtom *targets,
gint n_targets);
gboolean e_targets_include_directory
(GdkAtom *targets,
gint n_targets);
+gboolean e_targets_include_html (GdkAtom *targets,
+ gint n_targets);
/* Clipboard Functions */
@@ -74,6 +87,9 @@ void e_clipboard_set_directory
(GtkClipboard *clipboard,
const gchar *source,
gint length);
+void e_clipboard_set_html (GtkClipboard *clipboard,
+ const gchar *source,
+ gint length);
void e_clipboard_request_calendar
(GtkClipboard *clipboard,
GtkClipboardTextReceivedFunc callback,
@@ -82,14 +98,21 @@ void e_clipboard_request_directory
(GtkClipboard *clipboard,
GtkClipboardTextReceivedFunc callback,
gpointer user_data);
+void e_clipboard_request_html(GtkClipboard *clipboard,
+ GtkClipboardTextReceivedFunc callback,
+ gpointer user_data);
gchar * e_clipboard_wait_for_calendar
(GtkClipboard *clipboard);
gchar * e_clipboard_wait_for_directory
(GtkClipboard *clipboard);
+gchar * e_clipboard_wait_for_html
+ (GtkClipboard *clipboard);
gboolean e_clipboard_wait_is_calendar_available
(GtkClipboard *clipboard);
gboolean e_clipboard_wait_is_directory_available
(GtkClipboard *clipboard);
+gboolean e_clipboard_wait_is_html_available
+ (GtkClipboard *clipboard);
G_END_DECLS